7

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は非常に高価になる可能性があります。

何か不足していますか?

Scalaz の Option.scala ソース

4

1 に答える 1

4

問題の対称性を強調し、明確にするために書かれたように見えますが、速度のためではありません。2 番目の引数の遅延をそのように定義しているため、単純に削除することはできませんSemigroup。他のコンテキストでは、2 番目の引数の遅延が不可欠になる場合があります。問題の対称性の視覚的表現を維持するには、おそらく追加するだけです

val g2 = f2  // Force evaluation
(f1, g2) match { ...

または何か。

(名前によって引数が自動的にメモ化されるように lazy を呼び出すことができれば、それは素晴らしいことです。)

于 2013-05-02T22:23:08.387 に答える