La definizione di opzione monoid del scalaz è la seguente:Perché l'implementazione di Monoid for Option di scalaz valuta la funzione f2 due volte?
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
è un passaggio per nome param che significa che ogni chiamata valutare l'espressione. Perché dovrebbe essere valutato di nuovo quando è stato appena valutato nel pattern match? Restituire Some(a2)
dovrebbe essere lo stesso risultato e l'espressione f2
potrebbe essere molto costosa.
Mi manca qualcosa?
Probabilmente un riporto dal Haskell pensare in cui la definizione equivalente è a buon mercato? –
Hai provato questo? Metti un po 'di println al suo interno e controlla. – Felix
Sì, l'ho provato e il println è stato colpito due volte. Lo aggiusterò e invierò una richiesta pull a scalaz, credo. – coltfred