Как мне объявить класс дел Scala экземпляром полугруппы Скалаза?

У меня есть тип, определенный следующим образом:

import scalaz._, Scalaz._
case class MyInt(i : Int)

Я хочу сделать пример Semigroup, Я попробовал это:

object MyInt {
  implicit def myIntSemigroup: Semigroup[MyInt] = new Semigroup[MyInt] {                                                                                                                                                                       
    def append(a: MyInt, b: MyInt) : MyInt = MyInt(a.i + b.i)
  }
}

Когда я бегу sbt consoleЯ получаю эту ошибку:

[info] Set current project to hello (in build file:/home/mp/code/scala/examples/semigroup/)
[info] Compiling 1 Scala source to /home/mp/code/scala/examples/semigroup/target/scala-2.10/classes...
[error] /home/mp/code/scala/examples/semigroup/src/main/scala/Main.scala:6: object creation impossible, since method append in trait Semigroup of type (f1: MyInt, f2: => MyInt)MyInt is not defined
[error]   implicit def myIntSemigroup: Semigroup[MyInt] = new Semigroup[MyInt] {                                                                                                                                                               
[error]                                                       ^   
[error] one error found
[error] (compile:compile) Compilation failed
[error] Total time: 5 s, completed 25-Jun-2015 08:15:37

Как мне сделать MyInt Semigroup так что я могу использовать |+| в теме?

Для полноты вот мой build.sbt файл:

name := "hello"
version := "1.0"
scalaVersion := "2.10.5"
libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.1.3"

1 ответ

Решение

Если вы внимательно посмотрите на сигнатуру полугруппы Scalaz, второй параметр определяется как имя, а в вашей реализации у вас другая сигнатура. Измените свой второй параметр на b: => MyInt и это должно скомпилировать

Другие вопросы по тегам