return
definiert sind.Monad
der Operator >>=
für die Operation
bind verwendet.
Monad
in der Hakell Prelude ist
class Monad m where
(>>=) :: m a -> ( a -> m b ) -> m b
return :: a -> m a
(>>) :: m a -> m b -> m b
fail :: String -> m a
m >> k = m >>= \_ -> k
fail s = error s
>>
verknüpft, wie >>=
zwei Berechnungen und verwirft
das Ergebnis der ersten.
return
ist das Nullelement der Operation >>=
, und >>=
ist assoziativ:
return a >>= k = k a
m >>= return = m
m >>= (\x -> k x >>= h) = (m >>= k) >>= h
(Monad a) => a b
.
hello :: String -> IO ()
hello x = putStr ("Hello " ++ x)
data Id a = Id a
instance Monad Id where
(Id x) >>= f = f x
return x = Id x
(Id _) >> f = f
fail s = error s
extract :: Id a -> a
extract (Id x) = x
mul :: Int -> Int -> Id Int
mul x y = return (x * y)
div_ :: Int -> Int -> Id Int
div_ _ 0 = fail "div 0"
div_ x y = return (x ´div´ y)
one :: Int -> Id Int
one x = mul x x >>= \_ ->
mul x 1 >>= \y ->
div_ y x
> one 5 ==> 1
> one 0 ==> Fehler des Interpreters: "div 0"
do
-Notation
>>=
und >>
.
one x = mul x x >> one x = do mul x x
mul x 1 >>= \y -> y <- mul x 1
div_ y x div_ y x
let
an einen Namen zu binden.
one x = do mul x x
let eins = 1 in
y <- mul x eins
div_ y x
do
-Notation lassen sich leicht in Ausdrücke
mit >>=
und return
umwandeln.
one x = do { mul x x; y <- mul x 1; div_ y x; }