Indexedモナド
i
と o
を同じにすれば通常のMonadを作れる
以下のようなことができる
指定した順序で実行できる
monadic computationで出力の型を変えられる
定義
hsclass 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
と同じ

a
は、monadic computationによって生成される値の型
通常のmonadにおける
m a
の
a
と同じ

i
は、monadic computationを実行する前の型
j
は、monadic computationの実行した後の型
do記法
既存の do
は、通常のMonadのための糖衣構文なので
IxMonadを楽に書くためには、
元の do
の役割を無視して、
IxMonad用の do
を使用する必要がある
その実現方法
ユースケース
途中で状態の型を変えるStateモナド
React Basic Hooks
指定した順序でパンやチーズを重ねていく
重ねる順番を間違うと型エラー
既存のHogeモナドをIxMonadで定義し直したものは、Indexed Hoge Monadのように呼ぶ
例
関連
参考
簡潔でわかりやすい
最初に読むと良さそう
全ての通常のMonadは、IxMonadで表現できる
hsnewtype 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は引数が通常のモナドに対して入れ替わっているのか
#??hsclass IxApplicative m => IxMonad m where
ibind :: (a -> m j k b) -> m i j a -> m i k b
1,2番めの引数が普通と逆になっている

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