¡Esta pregunta no es cebo de llama! Como podría ser evidente, he estado mirando Scalaz recientemente. Intento entender por qué Necesito algunas de las funciones que proporciona la biblioteca. Aquí hay algo:Scalaz: solicitud de uso para la composición de Cokleisli
import scalaz._
import Scalaz._
type NEL[A] = NonEmptyList[A]
val NEL = NonEmptyList
os pongo unas declaraciones println en mis funciones para ver lo que estaba pasando (a un lado: ¿qué habría hecho si yo estaba tratando de evitar efectos secundarios como la que?). Mis funciones son:
val f: NEL[Int] => String = (l: NEL[Int]) => {println("f: " + l); l.toString |+| "X" }
val g: NEL[String] => BigInt = (l: NEL[String]) => {println("g: " + l); BigInt(l.map(_.length).sum) }
Entonces ellos combinan a través de un cokleisli y pasan en un NEL[Int]
val k = cokleisli(f) =>= cokleisli(g)
println("RES: " + k(NEL(1, 2, 3)))
Lo que hace esta impresión?
f: NonEmptyList(1, 2, 3)
f: NonEmptyList(2, 3)
f: NonEmptyList(3)
g: NonEmptyList(NonEmptyList(1, 2, 3)X, NonEmptyList(2, 3)X, NonEmptyList(3)X)
RES: 57
El valor RES es el número de caracteres de los elementos (Cadena) en la NEL final. Dos cosas se me ocurren:
- ¿Cómo podría haber sabido que mi NEL iba a reducirse de esta manera a partir de las firmas de métodos implicadas? (No esperaba el resultado en total)
- ¿Qué sentido tiene esto? ¿Se puede destilar para mí un caso de uso razonablemente simple y fácil de seguir?
Esta pregunta es una súplica apenas velado por alguna persona encantadora como retronym para explicar cómo esta poderosa biblioteca funciona realmente.
Gracias por esta respuesta - He aceptado * retronym's * porque ha respondido a la solicitud de un caso de uso, pero este sigue siendo excelente. –
No hay problema, he editado la respuesta de retronym para agregar un ejemplo de composición de cokleisli. – Apocalisp
Creo que "no se puede' mapear (f) 'para obtener' W [W [A]] => W [B] '", ¡ay !, no tengo derechos de edición. –