实现Monoid [Option [A]]编译时错误

时间:2013-10-21 03:10:15

标签: scala

尝试从FP in Scala实施optionMonoid[A]时,我写道:

def optionMonoid[A] = new Monoid[Option[A]] {
    def op(a1: Option[A], a2: Option[A]) = (a1, a2) match {
        case (Some(x), Some(y)) => Some(x + y)
        case _ => None
    }
    val zero = None
}

为什么编译时错误需要String?

C:\Users\Kevin\Workspace\side-work\Monoid>scalac MonoidTesting.scala
MonoidTesting.scala:43: error: type mismatch;
 found   : A
 required: String
                        case (Some(x), Some(y)) => Some(x + y)
                                                        ^

1 个答案:

答案 0 :(得分:6)

我猜您需要为Monoid传递A个实例,以便op案例Some(x), Some(y)中的两个值def optionMonoid[A](implicit aMonoid:Monoid[A]) = ... case (Some(x),Some(y)) => Some(aMonoid.op(x,y)) 。从内存中,通常使用隐式arg:

zero

您还需要修正Monoid定义,因为它目前不符合op(x, zero) === x === op(zero, x)身份法,即{{1}}。我认为这是一个很有用的练习,所以我暂时省略了实现。