generated at
Indexedモナド
IxMonadはMonadの一般化である
i o を同じにすれば通常のMonadを作れる
モナド則を満たす
以下のようなことができる
複数のmonadic computationを適切な順序で実行する
指定した順序で実行できる
monadic computationで出力の型を変えられる




定義
通常のMonad型クラスに、型引数を追加したもの
hs
class IxMonad m where return :: a -> m i i a (>>=) :: m i j a -> (a -> m j k b) -> m i k b
m i j a の型の意味
m は、moand
通常のmonadにおける m a m と同じmrsekut
a は、monadic computationによって生成される値の型
通常のmonadにおける m a a と同じmrsekut
i は、monadic computationを実行する前の型
j は、monadic computationの実行した後の型


do記法
既存の do は、通常のMonadのための糖衣構文なので
IxMonadを楽に書くためには、
元の do の役割を無視して、
IxMonad用の do を使用する必要がある
その実現方法
この記事が書かれた当時はRebindableSyntaxがなかった


ユースケース
途中で状態の型を変えるStateモナド
React Basic Hooks
指定した順序でパンやチーズを重ねていく
重ねる順番を間違うと型エラー



既存のHogeモナドをIxMonadで定義し直したものは、Indexed Hoge Monadのように呼ぶ

関連


参考
簡潔でわかりやすい
最初に読むと良さそう



全ての通常のMonadは、IxMonadで表現できる
hs
newtype MW m p q a = MW { unMW:: m a } instance Monad m => IxMonad (MW m) where ireturn = MW . return ibind (MW m) f = MW (m >>= unMW . f)
MW は幽霊型



purs
purs(hs)
newtype Indexed ∷ ∀ ix. (Type → Type) → ix → ix → Type → Type newtype Indexed m x y a = Indexed (m a) class IxApply ∷ ∀ ix. (ix → ix → Type → Type) → Constraint class IxBind ∷ ∀ ix. (ix → ix → Type → Type) → Constraint




なぜこのpackageのbindは引数が通常のモナドに対して入れ替わっているのか #??
hs
class IxApplicative m => IxMonad m where ibind :: (a -> m j k b) -> m i j a -> m i k b
1,2番めの引数が普通と逆になっているmrsekut


>Indexed Monadと普通のMonadを型クラスで抽象化したパッケージ