f = do
putStrLn "1"
putStrLn "2"
main = f
私が理解している通りにf
は(putStrLn "1")>>=(\_ -> (putStrLn "2"))
になります。ラムダ(モナドの持ち上げ)を適用している間に印刷操作が完了しましたか?誰かがどの段階でどの部分が評価され実行されるかを私に説明することはできますか?最初に印刷されるのは、以下のhaskellコードです。
f = do
putStrLn "1"
putStrLn "2"
main = f
私が理解している通りにf
は(putStrLn "1")>>=(\_ -> (putStrLn "2"))
になります。ラムダ(モナドの持ち上げ)を適用している間に印刷操作が完了しましたか?誰かがどの段階でどの部分が評価され実行されるかを私に説明することはできますか?最初に印刷されるのは、以下のhaskellコードです。
putStrLn
は()
WICHを捨て、次いでちょうど第二putStrLn
計算されることを要する第2の機能をエルゴので、それは計算を行い、次いでIO
モナドで()
を返すタイプString -> IO()
です。
順序は次のようになります
1.- putStrLn "1"
2-結果として()
よう
3.- \() -> putStrLn 2
4.- putStrLn 2
得ますあなたが思考をするためには、それはまったく同じではありません。
ステップ3の後にプログラムがクラッシュし、画面に "1"が表示されたとしますか? – abhishek
@abhishek修正。 'do {putStrLn" 1 "; undefined} '' 1'を出力してクラッシュします。 – 4castle
@ 4castleあなたの返事に感謝します。関数 'f'は本体を評価し、mainが実行するmainへのモナドを返します。だから、上記のコードでfが決して内側にないブロックで返ってくることはないでしょう。 '>'は決して成功しないので、メインは決して実行されないので、副作用は起こりません。 AFAIUは主に副作用がありますか? – abhishek
'IO'モナドは、特に副作用の評価順序を保証するように設計されています。しかし、一般的には、Haskellは、式のどの部分が最初に評価されるかを保証しません。唯一の保証は、可能な限り怠惰になることです。 – 4castle