generated at
Monad型クラス
>>= return を実装した型
Monadのインスタンスにするためには、Applicativeのインスタンスである必要がある
なのでMonadはApplicative型クラスでありFunctor型クラスでもある
ほんまは
しかしHaskellの歴史的に、最初にFunctorとMonadが導入され、その後にApplicativeが導入されたので、Haskell界の必ずしも全てのMonadがApplicativeというわけではない
が、適切に実装すれば全てのMonadがApplicativeになる
モナド則を満たす

定義側と、使用側で見てみると良いかもmrsekut
適当に命名してこのプロジェクト内で使用する


Monad型クラスの定義
hs
class Applicative m => Monad (m :: * -> *) where (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b return :: a -> m a
return は普通の値からアクションを作る
他の言語のreturnとは全く異なる
Applicative型クラスのpureと同じ
>>= は bindと呼ぶ
a -> m b m a を入れる為に一旦モナドから値を取り出して渡す感じ
>> って何が嬉しいん?なんのためにあるん?mrsekut
actionから値を取り出して捨て、次のactionに移る
hs
test = print 1 >> print 2 main = test2
bindで書くなら
hs
test = print 1 >>= \_ -> print 2
do記法で書くなら
hs
test = do print 1 -- _ <- print 1 と同じ。値を捨てている print 2


PureScriptの場合
purs(hs)
class (Applicative m, Bind m) <= Monad m
Bind型クラスを継承する
結果的にはhsと同じモノmrsekut


bindを使っている例
hs
-- Maybe let justInc x = Just (x+1) -- 普通の値を引数に取り、モナドを返す -- bindがないならこう書いてるだろう withoutBind = do x <- Just 3 justInc x withBind = Just 3 >>= justInc -- IO main = do print =<< return 2


>> を使っている例
hs
(Just 3) >> (Just 4) -- Just 4 (Just 3) >>= \_ -> (Just 4) -- 上と同じ





モナド関数 a -> m a の関数合成
普通の関数 a -> b の関数合成 . のモナド関数版
hs
(<=<) :: (Monad m) => (b -> m c) -> (a -> m b) -> (a -> m c) f <=< g = (\x -> g x >>= f)

<=<の逆向き
モナド関数 a -> m a の関数合成
関数合成 >>> のモナド関数版



関連する関数
forM











flatMap:: m a -> (a -> m b) -> m b
scala
// flatMap :: m a -> (a -> m b) -> m b // f :: a -> m b option.flatMap(f) option match { case Some(v) => f(v) case None => None }



モナドを自作する
ParsecのParserモナドを作る
Rustで実装 ref
TypeScriptで実装 ref
HaskellのMonad型クラスの遍歴