Bei addStuff
addStuff :: Int -> Int
addStuff = do
a<-(*2)
b<-(+10)
return (a+b)
die Definition desugars in
addStuff =
(* 2) >>= \a ->
(+ 10) >>= \b ->
return (a + b)
Bewegen der Maus über die >>=
in fpcomplete online editor zeigt
:: 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)
Das führt uns verwenden wir eine Monade Instanz für Funktionen führt zu glauben, . In der Tat, wenn wir an der source code betrachten, sehen wir
instance Monad ((->) r) where
return = const
f >>= k = \ r -> k (f r) r
diese neu gewonnenen Informationen verwenden, können wir die addStuff
Funktion selbst bewerten.
der anfänglichen Ausdruck
(* 2) >>= (\a -> (+10) >>= \b -> return (a + b))
wir die >>=
Definition ersetzen Verwendung gegeben, uns zu geben (im folgenden {}
, []
, ()
unterschiedliche Tiefe von ()
nur illustrieren)
\r1 -> {\a -> (+10) >>= \b -> return (a + b)} {(* 2) r1} r1
vereinfachen
die zweite -letzter Begriff innerhalb des äußersten Lambdas
\r1 -> {\a -> (+10) >>= \b -> return (a + b)} {r1 * 2} r1
gelten {r1 * 2}
zu {\a -> ...}
\r1 -> {(+10) >>= \b -> return ((r1 * 2) + b)} r1
Ersatz verbleibende >>=
mit ihrer Definition wieder
\r1 -> {\r2 -> [\b -> return (r1 * 2 + b)] [(+10) r2] r2} r1
vereinfachen zweiten bis letzten Begriff innerhalb des inneren lambda
\r1 -> {\r2 -> [\b -> return (r1 * 2 + b)] [r2 + 10] r2} r1
gelten [r2 + 10]
bis 012.
\r1 -> {\r2 -> [return (r1 * 2 + (r2 + 10))] r2} r1
gelten r1
zu {\r2 -> ...}
\r1 -> {return (r1 * 2 + r1 + 10) r1}
Ersatz return
mit seiner Definition
\r1 -> {const (r1 * 2 + r1 + 10) r1}
const x _ = x
\r1 -> {r1 * 2 + r1 + 10}
012 bewerten
prettify
\x -> 3 * x + 10
schließlich wir
addStuff :: Int -> Int
addStuff = (+ 10) . (* 3)
'<-' * Gilt nicht * 'entfernen', um den Wert von einer Monade erhalten.Es ist der syntaktische Zucker, der * einen Wert herauszieht, aber tatsächlich nur auf eine bestimmte Weise manipuliert. Aus diesem Grund können Sie Funktionen als Monaden behandeln, da Sie zwar das Ergebnis einer Funktion nicht buchstäblich "herausziehen" können, aber Funktionen zusammenführen können, um eine andere zu erstellen. – AJFarmar