質問

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#についてはよくわかりませんが、非常に直感的に思えます(他の多くの言語でも同じ概念があります)。

  1. intを受け取り、intを受け取ってintを返す関数を返す関数です
  2. intを受け取り、intを返す関数を受け取り、intを返す関数です

    1つ目はカリー化された関数のようなものです。

では、実装がどのようになるか見てみましょう:

最初 ジェネラコディセタグプレ

これにはint -> (int -> int)の署名があります

func1 2 3は機能しないことに注意してください

編集:結合性の仕組みにより、これは実際には問題ないことがわかりました

しかし、これはとは異なります ジェネラコディセタグプレ

これは一種のint -> int -> intを持っています

ここではfunc2 1 2で問題ありません

次のように作成できる他の例: ジェネラコディセタグプレ

これには、('t->int) -> uの署名があり、具体的なaを選択すると機能します。func4 1 2は間違いなくコンパイルされないことに注意してください

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top