Haskell のモナドについて存在論的な質問があります。言語がステートメントと式をまったく区別するかどうかについて、私は動揺しています。たとえば、他のほとんどの言語では、次のような署名を持つものa -> SomeMonadProbs ()
はすべてステートメントと見なされるように感じます。とは言うものの、haskell は純粋に関数型であり、関数は式で構成されているため、モナドの式に関する観点から haskell が何を言おうとしているのかについて、私は少し混乱しています。
3 に答える
Monad
式を操作するためのインターフェイスの 1 つにすぎません。たとえば、do
表記法を使用して実装された次のリスト内包表記を考えてみましょう。
example :: [(Int, Int)]
example = do
x <- [1..3]
y <- [4..6]
return (x, y)
それは次のように脱糖します:
[1..3] >>= \x ->
[4..6] >>= \y ->
return (x, y)
(>>=)
...そしてforリストの定義を代入すると、次のようになります。
concatMap (\x -> concatMap (\y -> [(x, y)]) [4..6]) [1..3]
重要なアイデアは、do
記法を使用してできることはすべて の呼び出しに置き換えることができるということ(>>=)
です。
Haskell の「ステートメント」に最も近いものはdo
、次のような記法ブロックの構文行です。
x <- [1..3]
これらの行は、孤立した式ではなく、自己完結型ではない式の構文上の断片に対応しています。
[1..3] >>= \x -> ... {incomplete lambda}
したがって、すべてが Haskell の式であると言う方が適切do
です。記法は、一連のステートメントのように見えますが、実際にはフードの下で一連の式に脱糖するものを提供します。
言語が文と式を区別するかどうか
そうではありません。文法には「ステートメント」などの生成はなく、言語記述では「ステートメント」またはそれに相当するものは (私の知る限り) ありません。
言語レポートは、do
表記「ステートメント」内の要素を呼び出します。式ではないステートメントには次の 2 種類がありますpat <- exp`` and
。
他のほとんどの言語では、次のような署名を持つもの
a -> SomeMonadProbs ()
はすべてステートメントと見なされます
Haskell は他のほとんどの言語とは異なります。それはちょっとしたポイントです(明らかに、それのために異なるわけではありませんが、式とステートメントを単一の構造に統合しています)。