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