Questa domanda non è intesa come esca di fiamma! Come potrebbe essere evidente, ho guardato allo Scalaz di recente. Sto cercando di capire why Ho bisogno di alcune delle funzionalità fornite dalla libreria. Ecco qualcosa:Scalaz: richiesta per caso d'uso per composizione Cokleisli
import scalaz._
import Scalaz._
type NEL[A] = NonEmptyList[A]
val NEL = NonEmptyList
ho messo alcune dichiarazioni println nelle mie funzioni per vedere cosa stava succedendo (parte: cosa avrei fatto se stavo cercando di evitare effetti collaterali come quello?). Le mie funzioni sono:
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) }
Allora io li uniscono tramite un cokleisli e passare in un NEL[Int]
val k = cokleisli(f) =>= cokleisli(g)
println("RES: " + k(NEL(1, 2, 3)))
Che cosa significa questa stampa?
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
Il valore RES è il numero di caratteri degli elementi (String) nel NEL finale. Mi vengono in mente due cose:
- Come potevo sapere che il mio NEL sarebbe stato ridotto in questo modo dalle firme del metodo in questione? (Non mi aspettavo il risultato per tutto)
- Qual è il punto di questo? Per me può essere distillato un caso d'uso ragionevolmente semplice e facile da seguire?
questa domanda è un appello malcelato per qualche bella persona come retronym di spiegare come questo potente libreria funziona realmente.
Grazie per questa risposta - Ho accettato * retronym * perché ha risposto alla richiesta di un caso d'uso ma questo è ancora ottimo! –
Nessun problema, ho modificato la risposta del retronym per aggiungere un esempio di composizione cokleisli. – Apocalisp
Credo che "puoi' map (f) 'per ottenere' W [W [A]] => W [B] '", purtroppo non ho diritti di modifica. –