scalaz的option monoid定义如下:
implicit def optionMonoid[A: Semigroup]: Monoid[Option[A]] = new Monoid[Option[A]] {
def append(f1: Option[A], f2: => Option[A]) = (f1, f2) match {
case (Some(a1), Some(a2)) => Some(Semigroup[A].append(a1, a2))
case (Some(a1), None) => f1
case (None, Some(a2)) => f2
case (None, None) => None
}
def zero: Option[A] = None
}
f2
是按名称传递的参数,这意味着每次调用都会评估表达式。刚刚在模式匹配中求值的时候,为什么还要再求值呢?返回Some(a2)
应该是相同的结果,并且表达式f2
可能非常昂贵。
我错过了什么吗?