Voglio implementare le mie monade e funtori compatibili per la comprensione in Scala.Come rendere la scala monad conforme alla propria comprensione?
Prendiamo due stupide monadi come esempio. Una monade è una monade di stato che contiene un "Int" che puoi mappare o mappare.
val maybe = IntMonad(5)
maybe flatMap(a => 3 * (a map (() => 2 * a)))
// returns IntMonad(30)
Un altro monade si fa composizione funzione in questo modo ...
val func = FunctionMonad(() => println("foo"))
val fooBar = func map (() => println("bar"))
fooBar()
// foo
// bar
// returns Unit
L'esempio può avere alcuni errori, ma si ottiene l'idea.
Voglio essere in grado di utilizzare questi due diversi tipi di Monade composte all'interno di una comprensione per Scala. Come questo:
val myMonad = IntMonad(5)
for {
a <- myMonad
b <- a*2
c <- IntMonad(b*2)
} yield c
// returns IntMonad(20)
io non sono un maestro Scala, ma si ottiene l'idea
sarebbe meglio utilizzare il tipo di Scallaz Monade invece di definire il proprio? –
'filter' api richiede anche di" decomprimere "gli elementi monad. Ad esempio se si utilizza un MaybeAB simile a MaybeInt ma per un 'caso di classe AB (a: Int, b: Int)', il filtro è richiesto per fare 'for (AB (a, b) <- maybAB) ... ' –