Scalaz fornisce un metodo denominato fold
per vari ADT come Boolean
, Option[_]
, Validation[_, _]
, Either[_, _]
ecc. Questo metodo utilizza fondamentalmente le funzioni corrispondenti a tutti i casi possibili per quello determinato ADT. In altre parole, una partita modello mostrato sotto:Qual è la relazione tra fold su Option, o etc e fold su Traversable?
x match {
case Case1(a, b, c) => f(a, b, c)
case Case2(a, b) => g(a, b)
.
.
case CaseN => z
}
è equivalente a:
x.fold(f, g, ..., z)
Alcuni esempi:
scala> (9 == 8).fold("foo", "bar")
res0: java.lang.String = bar
scala> 5.some.fold(2 *, 2)
res1: Int = 10
scala> 5.left[String].fold(2 +, "[" +)
res2: Any = 7
scala> 5.fail[String].fold(2 +, "[" +)
res6: Any = 7
Allo stesso tempo, c'è un'operazione con la stessa nome per i tipi Traversable[_]
, che attraversa la raccolta eseguendo determinate operazioni sui suoi elementi e accumulando il valore del risultato. Ad esempio,
scala> List(2, 90, 11).foldLeft("Contents: ")(_ + _.toString + " ")
res9: java.lang.String = "Contents: 2 90 11 "
scala> List(2, 90, 11).fold(0)(_ + _)
res10: Int = 103
scala> List(2, 90, 11).fold(1)(_ * _)
res11: Int = 1980
Perché questi due operazioni identificato con lo stesso nome - fold
/catamorphism? Non riesco a vedere alcuna somiglianza/relazione tra i due. Cosa mi manca?
Oh, quindi deve essere applicato in modo ricorsivo! Ha senso, grazie. – missingfaktor
[La pagina di Wikipedia su "catamorphism"] (http://en.wikipedia.org/wiki/Catamorphism) dice: "Nella programmazione funzionale, un catamorfismo è una generalizzazione delle pieghe su elenchi noti dalla programmazione funzionale a dati algebrici arbitrari tipi che possono essere descritti come algebre iniziali. " Indica quindi il testo di Erik Meijer "Programmazione funzionale con banane, lenti, buste e filo spinato". Penso che dovrei leggere quel documento per capire meglio l'argomento. – missingfaktor
@missingfaktor, alla fine della pagina di Wikipedia c'è un blog in 6 parti sul catamorfismo che sembra molto accessibile. Lo sto leggendo adesso. È F # ma sono sicuro che non sarà un problema per te. – huynhjl