との両方を定義する式を提供していafunc
ますamfunc
。Let-expressionsとdo-blocksはどちらも式です。ただし、let-expressionは、「in」キーワードの後に指定された式をスコープとする新しいバインディングを導入しますが、do-blockは式で構成されていません。これは、一連のステートメントです。do-blockには、次の3つの形式のステートメントがあります。
結果がいくつかの変数x
にバインドされている計算。
x <- getChar
次のように、結果が無視される計算
putStrLn "hello"
のように、letステートメント
let x = 3 + 5
letステートメントは、let式と同じように、新しいバインディングを導入します。この新しいバインディングの範囲は、do-blockの残りのすべてのステートメントに拡張されます。
つまり、let式の「in」の後に続くのは式ですが、let式の後に続くのは一連のステートメントです。もちろん、let-expressionを使用して特定のステートメントの計算を表現することはできますが、バインディングの範囲は、そのステートメントを超えて後続のステートメントに拡張されることはありません。検討:
do putStrLn "hello"
let x = 3 + 5 in putStrLn "eight"
putStrLn (show x)
上記のコードにより、GHCで次のエラーメッセージが表示されます。
Not in scope: `x'
一方
do putStrLn "hello"
let x = 3 + 5
putStrLn "eight"
putStrLn (show x)
正常に動作します。