Haskell と関数型プログラミングは初めてです。Real World Haskell を読んでいて、いくつかの例に混乱していることに気付きました。
具体的には、第 9 章の「述語用のドメイン固有言語」セクションに、wxyz パラメータを持つ例があります。
私はこれに要約しました:
このコードがコンパイルされるのはなぜですか?
f :: Int -> (Int -> Int)
f x y = x+y
main = do
let q = f 4 5
putStr (show (q))
型シグネチャによると、f
明らかに 1 つのパラメーターを受け取り、関数を返します。ただし、2 つのパラメーターを受け入れて int を返すように、関数方程式を記述できるようです。なぜこれが可能なのですか?これは、型シグネチャが無視されることを意味しますか?
これはカレーですか?これはある種の閉鎖ですか?このhttp://www.haskell.org/haskellwiki/Curryingを正しく理解していれば、そこで定義されているカリー化とは逆のように思えます。私のf
関数は単一の引数ではなく複数の引数を取ります!
また、誰でも回答できますか?この機能が記載されているある種のHaskellドキュメントへのリンクを提供してください(可能であれば)。
編集:
このことについてしばらく考えた後、お二人が暗示しているように思われるのは、次のことです。
1) この構文はシンタックス シュガーです。式にいくつのパラメーターが記述されていても、f は常に 1 つのパラメーターを持ちます。
2) f を適用すると、関数本体は (常に?) スタブ (実際には、返される関数) に変換されます。ここで、x は (4) で指定されたパラメーターに固定され、y はパラメーターです。
3) 次に、この新しい関数が 5 に適用され、y が置き換えられ、+ 関数が評価されます。
私が本当に興味を持ったのは、上で書いたように、「関数方程式で、複数のパラメーターを記述すると、実際には構文糖衣であり、次のことが実際に発生します...」のようなことを正確にどこで言っているのかということでした。それとも、それは私以外の誰にとっても明らかですか?
編集 II:
本当の目を見張るような答えは、以下の @luqui コメントにありました。残念ながら、コメントを答えとしてマークすることはできないと思います。
fxy = ... は実際には次の構文糖衣であるという事実です: f = \x -> \y -> ...
そして、私にとって、以下のすべての人が言ったことはすべてこれからです。
Haskellのジェントルイントロダクションで、これに関する一種のソースを見つけました.http: //haskell.cs.yale.edu/tutorial/functions.htmlのセクション3.1で、ラムダ抽象化と呼ばれています。
実際、方程式は次のとおりです。
inc x = x+1 add xy = x+y
は、次の略記です。
inc = \x -> x+1 add = \xy -> x+y
「シンタックス シュガー」という語句は使用していませんが、数学的な意味合いの強い「速記」という言葉を使用していますが、プログラマーとして私はこれを「シュガー」と読みます :-)