Attribuite addStuff
addStuff :: Int -> Int
addStuff = do
a<-(*2)
b<-(+10)
return (a+b)
le desugars definizione in
addStuff =
(* 2) >>= \a ->
(+ 10) >>= \b ->
return (a + b)
passa il mouse sopra il >>=
in fpcomplete online editor mostra
:: Monad m => forall a b.
(m a ) -> (a -> m b ) -> (m b )
:: (Int -> a ) -> (a -> Int -> b ) -> (Int -> b )
:: (Int -> Int) -> (Int -> Int -> Int) -> (Int -> Int)
Questo ci porta a credere che usiamo un'istanza Monade per le funzioni . In effetti, se guardiamo il source code, vediamo
instance Monad ((->) r) where
return = const
f >>= k = \ r -> k (f r) r
Utilizzando queste informazioni appena ottenute possiamo valutare la funzione addStuff
noi stessi.
Dato l'espressione iniziale
(* 2) >>= (\a -> (+10) >>= \b -> return (a + b))
sostituiamo utilizzando la definizione >>=
, dando noi (nel seguito {}
, []
, ()
solo illustrano diverse profondità di ()
)
\r1 -> {\a -> (+10) >>= \b -> return (a + b)} {(* 2) r1} r1
semplificare la seconda -ultimo termine all'interno del lambda più esterno
\r1 -> {\a -> (+10) >>= \b -> return (a + b)} {r1 * 2} r1
applicano {r1 * 2}
a {\a -> ...}
\r1 -> {(+10) >>= \b -> return ((r1 * 2) + b)} r1
sostituto rimanente >>=
con la sua definizione nuovamente
\r1 -> {\r2 -> [\b -> return (r1 * 2 + b)] [(+10) r2] r2} r1
semplificare secondo a ultimo termine all'interno lambda interna
\r1 -> {\r2 -> [\b -> return (r1 * 2 + b)] [r2 + 10] r2} r1
applicano [r2 + 10]
a 012.
\r1 -> {\r2 -> [return (r1 * 2 + (r2 + 10))] r2} r1
applica r1
a {\r2 -> ...}
\r1 -> {return (r1 * 2 + r1 + 10) r1}
sostituto return
con la sua definizione
\r1 -> {const (r1 * 2 + r1 + 10) r1}
valutare const x _ = x
\r1 -> {r1 * 2 + r1 + 10}
prettify
\x -> 3 * x + 10
Infine arriviamo
addStuff :: Int -> Int
addStuff = (+ 10) . (* 3)
'<-' * Non * 'rimuovere' il valore da una monade.È lo zucchero sintattico che * rappresenta * estraendo un valore, ma in realtà lo sta semplicemente manipolando in un modo specifico. Per questo motivo, puoi trattare le funzioni come monadi, perché, mentre non puoi letteralmente "estrarre" il risultato di una funzione, puoi unire le funzioni insieme per crearne un'altra. – AJFarmar