scalaz のオプション モノイドの定義は次のとおりです。
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
は非常に高価になる可能性があります。
何か不足していますか?