尝试从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)
^
答案 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}}。我认为这是一个很有用的练习,所以我暂时省略了实现。