Scalaz proporciona un método denominado fold
para diversos ADTs tales como Boolean
, Option[_]
, Validation[_, _]
, Either[_, _]
etc. Este método toma básicamente funciones correspondientes a todos los casos posibles para que, dada ADT. En otras palabras, una coincidencia de patrón muestra a continuación:¿Cuál es la relación entre la opción de doblar, o bien, etc. y doblar en Traversable?
x match {
case Case1(a, b, c) => f(a, b, c)
case Case2(a, b) => g(a, b)
.
.
case CaseN => z
}
es equivalente a:
x.fold(f, g, ..., z)
Algunos ejemplos:
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
Al mismo tiempo, hay una operación con la misma nombre para los tipos Traversable[_]
, que atraviesa la colección realizando cierta operación en sus elementos, y acumulando el valor del resultado. Por ejemplo,
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
¿Por qué estas dos operaciones identificadas con el mismo nombre - fold
/catamorphism? No veo ninguna similitud/relación entre los dos. ¿Qué me estoy perdiendo?
¡Oh, entonces tiene que ser aplicado recursivamente! Tiene sentido, gracias. – missingfaktor
[La página de Wikipedia sobre "catamorfismo"] (http://en.wikipedia.org/wiki/Catamorphism) dice: "En la programación funcional, un catamorfismo es una generalización de los pliegues en listas conocidas de programación funcional a datos algebraicos arbitrarios tipos que pueden describirse como álgebras iniciales ". A continuación, señala el trabajo de Erik Meijer "Programación funcional con plátanos, lentes, sobres y alambre de púas". Creo que debería leer ese artículo para comprender mejor el tema. – missingfaktor
@missingfaktor, al final de la página de wikipedia hay 6 partes de blog sobre catamorfismo que parecen muy accesibles. Lo estoy leyendo ahora mismo. Es F #, pero estoy seguro de que no será un problema para ti. – huynhjl