この便利な表記法で書かれているので、これは私にはかなり明白に思えます。でも、砂糖を抜いたバージョンを使って動作させることができないの>>=
が気になります。誰かがこれらを拡張表記で書き直してもらえますか?
ネストされていません
stack1 :: StateT Int Identity ( Int, Int )
stack1 = do
a <- get
put ( a + 1 )
b <- get
return ( a, b )
runstack1 :: ( Int, Int )
runstack1 = evalState stack1 11
ネスト
stack3 :: StateT Int ( StateT String ( StateT String Identity ) ) ( Int, String, String )
stack3 = do
modify (+10)
lift $ modify ( ++ " world" )
lift . lift $ modify ( ++ " word" )
a <- get
b <- lift get
c <- lift . lift $ get
return ( a, b, c )
runStack3 :: ( Int, String, String )
runStack3 = runIdentity $ evalStateT ( evalStateT ( evalStateT runStack3 1 ) "hello" ) "harro"
さらに、runStack1とrunStack3の署名を比較することで、なぜ必要なのかがわかりますrunIdentity
が、stack1とstack3の両方がIdentityコンストラクターをラップしているため、なぜこれが必要なのかを誰かが説明できますか?