17. そしてMonad
class Monad m where
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
ムムッ、よくわからないが似たカンジがする。
21. <$>と<*>の引数の型の順序を入れ替えてみると、
-- 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
同じ 同じ
32. instance Monad Maybe where
-- :: 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. -- :: m a -> (a -> m b) -> m b
Nothing >>= f = Nothing
Just x >>= f = f x
第二引数の関数 f は、生の値(文脈無しの値) x を
取って、文脈付きの 別の値 を返す。
関数f は、受け取った値 x に依っては
Nothingを返すこともできる!
35. -- :: m a -> (a -> m b) -> m b
Nothing >>= f = Nothing
Just x >>= f = f x
第二引数の関数 f は、生の値(文脈無しの値) x を
取って、文脈付きの 別の値 を返す。
関数f は、受け取った値 x に依っては
Nothingを返すこともできる!
75. Monad則もあるんだよ
return が id っぽく振る舞うよ
-- 左恒等性
return x >>= k = k x
-- 右恒等性
m >>= return = m
-- 結合性
(m >>= k) >>= h = m >>= (x -> k x >>= h)
76. Monad則もあるんだよ
return が id っぽく振る舞うよ
-- 左恒等性
return x >>= k = k x
-- 右恒等性
m >>= return = m
-- 結合性
(m >>= k) >>= h = m >>= (x -> k x >>= h)
結合の順序は関係ないよ