0

当试图在 Scala 中实现optionMonoid[A]from FP 时,我写道:

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
}

为什么编译时错误在这里需要一个字符串?

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)
                                                        ^
4

1 回答 1

6

我猜您需要传递一个Monoid实例,A以便您可以opSome(x), Some(y)案例中使用两个值。从记忆中,这通常使用隐式 arg 完成:

def optionMonoid[A](implicit aMonoid:Monoid[A]) = ...

    case (Some(x),Some(y)) => Some(aMonoid.op(x,y))

您还需要修正您的zero定义,因为它目前不满足Monoid恒等律,即op(x, zero) === x === op(zero, x). 我认为这是一个有用的练习,所以我现在将省略实现。

于 2013-10-21T05:33:22.470 回答