そしてMonad
class Monad mwhere
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
>>= は「バインド」と呼びます
18.
ApplicativeとMonadを見比べてみると、
--Applicative
pure :: a -> f a
-- Monad
return :: a -> m a
Applicative の pure と
Monad の return は同じような型で、
19.
Functor, Applicative, Monadを見比べてみると、
-- Functor
(<$>) :: (a -> b) -> f a -> f b
-- Applicative
(<*>) :: f (a -> b) -> f a -> f b
-- Monad
(>>=) :: m a -> (a -> m b) -> m b
ムムッ、よくわからないが似たカンジがする。
<$>と<*>の引数の型の順序を入れ替えてみると、
-- Functor -- Functor'
(<$>) :: (a -> b) -> f a -> f b (<$>) :: f a -> (a -> b) -> f b
-- Applicative -- Applicative'
(<*>) :: f (a -> b) -> f a -> f b (<*>) :: f a -> f (a -> b) -> f b
-- Monad -- Monad
(>>=) :: m a -> (a -> m b) -> m b (>>=) :: m a -> (a -> m b) -> m b
22.
第2引数の違いだけ!
-- Functor'
(<$>) ::f a -> (a -> b) -> f b
-- Applicative'
(<*>) :: f a -> f (a -> b) -> f b
-- Monad
(>>=) :: m a -> (a -> m b) -> m b
23.
第2引数の違いだけ!
-- Functor'
(<$>) ::f a -> (a -> b) -> f b
-- Applicative'
(<*>) :: f a -> f (a -> b) -> f b
-- Monad
(>>=) :: m a -> (a -> m b) -> m b
24.
第2引数の違いだけ! 違う
-- Functor'
(<$>) :: f a -> (a -> b) -> f b
-- Applicative'
(<*>) :: f a -> f (a -> b) -> f b
-- Monad
(>>=) :: m a -> (a -> m b) -> m b
25.
第2引数の違いだけ! 違う
-- Functor'
(<$>) :: f a -> (a -> b) -> f b
-- Applicative'
(<*>) :: f a -> f (a -> b) -> f b
-- Monad
(>>=) :: m a -> (a -> m b) -> m b
26.
第2引数の違いだけ! 違う
-- Functor'
(<$>) :: f a -> (a -> b) -> f b
-- Applicative'
(<*>) :: f a -> f (a -> b) -> f b
-- Monad
(>>=) :: m a -> (a -> m b) -> m b
同じ 同じ
instance Monad Maybewhere
-- :: x -> Maybe a
return = Just
-- :: Maybe a -> (a -> Maybe b) -> Maybe b
Nothing >>= f = Nothing
Just x >>= f = f x
33.
-- return ::x -> Maybe a
return = Just
returnは受け取った値をJustで
Maybeの文脈につつむだけ。
34.
-- :: ma -> (a -> m b) -> m b
Nothing >>= f = Nothing
Just x >>= f = f x
第二引数の関数 f は、生の値(文脈無しの値) x を
取って、文脈付きの 別の値 を返す。
関数f は、受け取った値 x に依っては
Nothingを返すこともできる!
35.
-- :: ma -> (a -> m b) -> m b
Nothing >>= f = Nothing
Just x >>= f = f x
第二引数の関数 f は、生の値(文脈無しの値) x を
取って、文脈付きの 別の値 を返す。
関数f は、受け取った値 x に依っては
Nothingを返すこともできる!
「選択」の mplus (Maybe)
> Just 1 `mplus` Just 2
左が優先
Just 1
右は失敗でも > Just 1 `mplus` Nothing
OK Nothing
> Nothing `mplus` Just 1
左がダメなら右
Just 1
両方ダメなら > Nothing `mplus` Nothing
失敗 Nothing