Haskell を使用するために学ぶ必要がある関数型プログラミングの基本概念の 1 つは、関数は単なる一種の値であり、定義は単なる名前であるということです。関数と変数の間に明確な区別があり、関数定義が変数定義と完全に異なる手続き型言語とは異なります。
したがって、次のような変数定義
addOne :: Int -> Int
addOne = add 1
は式の名前を追加するだけなadd 1
ので、 として参照できますaddOne
。変数宣言と同じです。[1] その変数の値が関数であるという事実は、Haskell の観点からはほとんど偶然です。
あなたのadd
定義:
add :: Int -> (Int -> Int)
add x y = x + y
も変数定義です。これは、Haskell が提供するちょっとした構文糖衣です。
add :: Int -> Int -> Int
add = \ x -> \ y -> x + y
そのほうが読みやすいという説。しかし、それはただの砂糖です。他の言語のように必要になることはありません (以下の [1] を除く)。
[1]:恐るべき単型性の制限ここにも登場します。アイデアはただ: 関数定義では、RHS はコンピューターによって何度も実行されます (関数を呼び出した回数だけ)。あなたはおそらく他の言語からこれを認識しています。モノモーフィックな変数定義では、RHS は多くても 1 回実行されます。これは、他の言語の動作と同様です。ただし、ポリモーフィック変数は多くの場合、関数定義のように動作し、RHS は変数の値がアクセスされる回数だけ実行されます。したがって、Haskell は、多相型シグネチャを持っていない限り (つまり、「自分が何をしているのかわかっているので、この変数を多相にすることを許可する」と言う)、または左側に引数を持っていない限り、多相定義を許可しません (つまり、「のように、RHS を何度も実行する必要があります)。