scalaz的Option Monoid的定义如下:
我是否遗漏了什么?
参考链接:Scalaz's Option.scala source
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
可能非常昂贵。我是否遗漏了什么?
参考链接:Scalaz's Option.scala source