質問
int->(int-> int)と(int-> int)-> intの2つのタイプについて質問があります。これら2つの違いは何ですか?
ここで、最初の関数は、intを受け取り、intを受け取り、intを返す関数として解釈できることを読みました。これは、int-> int-> intと同じです。これは正解?
解決
int -> (int -> int)
とint -> int -> int
の違いはごくわずかです(他の言語と相互運用する必要がある場合にのみ、実際に気になります)。これらは、2つの整数を効果的に受け取り、整数を返すカレー関数です(たとえば、組み込みの加算演算子には、これらの線に沿った型があります)。
ただし、これらは両方とも、整数から整数に関数を取り整数を返す(int -> int) -> int
とは大きく異なります。他の人が言及したように、そのような関数の唯一の簡単な例は、特定の値に特定の関数を適用することです(例:fun (f:int->int) -> f 13
)。
他のヒント
良い質問です。機能的にはそれほど違いはないと思います。私は、これら2つの署名を取得する方法を考え出すのに少し時間を費やしました。(John Palmerのlet fun1 i = fun j -> i + j
は、私にint -> int -> int
を提供するだけです)
ジェネラコディセタグプレ
2番目の署名の工夫されていない例は考えられませんでした: ジェネラコディセタグプレ
(これはあなたの質問に直接答えるものではありませんが、他の誰かに噛み砕く何かを与える可能性があります)
F#についてはよくわかりませんが、非常に直感的に思えます(他の多くの言語でも同じ概念があります)。
- intを受け取り、intを受け取ってintを返す関数を返す関数です
- intを受け取り、intを返す関数を受け取り、intを返す関数です
1つ目はカリー化された関数のようなものです。
では、実装がどのようになるか見てみましょう:
最初 ジェネラコディセタグプレ
これにはint -> (int -> int)
の署名があります
func1 2 3
は機能しないことに注意してください
編集:結合性の仕組みにより、これは実際には問題ないことがわかりました
しかし、これはとは異なります ジェネラコディセタグプレ
これは一種のint -> int -> int
を持っています
ここではfunc2 1 2
で問題ありません
次のように作成できる他の例: ジェネラコディセタグプレ
これには、('t->int) -> u
の署名があり、具体的なa
を選択すると機能します。func4 1 2
は間違いなくコンパイルされないことに注意してください