4
"モナドは、プログラマが順次ビルディングブロックを使用して計算を構築することを可能にする"ので、いくつかの計算を組み合わせることができます。この場合、次のコードを実行できない理由は何ですか?モナド対モナド変圧器
import Control.Monad.Trans.State
gt :: State String String
gt = do
name <- get
putStrLn "HI" -- Here is the source of problem!
put "T"
return ("hh..." ++ name ++ "...!")
main= do
print $ execState gt "W.."
print $ evalState gt "W.."
なぜ我々は(上の例のように)モナドで異なる機能を置くことができませんか?
なぜモナドを組み合わせるために追加のレイヤー、つまりトランスが必要なのですか?モナドで異なる機能を置くため機構である
ありがとうございます!最後の2行で= =を使った理由を教えてください。 – 4xx
['execStateT'](http://hackage.haskell.org/package/transformers-0.5.4.0/docs/Control-Monad-Trans-State-Lazy.html#v:execStateT)と[' evalStateT']( http://hackage.haskell.org/package/transformers-0.5.4.0/docs/Control-Monad-Trans-State-Lazy.html#v:evalStateT)は両方ともここで 'IO String'を返します。それらの中に 'String'を表示します。 ['= <<'](http://hackage.haskell.org/package/base-4.9.1.0/docs/Prelude.html#v:-61--60--60-)は、左の関数を呼び出します右側のモナドの内側の値を使用します。 – 4castle
@ 4xxこの同等のバージョンは、もっとおなじみかもしれません: 'main = do x < - execStateT gt" W .. "; xを印刷する。 y < - evalStateT gt "W .."; print y' – chi