次のようにscalazのオプションモノイドの定義は次のとおりです。scalazのOption for Monoidの実装がf2関数を2回評価するのはなぜですか?
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
は、各呼び出しが式を評価することを意味名前のparamによってパスです。なぜそれがパターンマッチで評価されただけで再び評価されるべきですか?返信Some(a2)
は同じ結果になり、式f2
は非常に高価になる可能性があります。
何か不足していますか?
同等の定義が安いですおそらくHaskellのからのキャリーオーバーが考えて? –
これはテストしましたか?その中にprintlnを入れて確認してください。 – Felix
はい私はそれをテストし、printlnは2回ヒットしました。私はそれを修正し、私が推測するスカラズにプルリクエストを提出します。 – coltfred