私はOCamlで授業をしていますが、表現の意味に関する質問がありました。(int - > int) - >(int - > int)はどういう意味ですか?
私は、例えば、書いた場合、関数を定義する場合:
let iter : int * (int -> int) -> (int -> int)
= fun (n,f) ->
(int -> int)
は何を意味するのでしょうか?
私はOCamlで授業をしていますが、表現の意味に関する質問がありました。(int - > int) - >(int - > int)はどういう意味ですか?
私は、例えば、書いた場合、関数を定義する場合:
let iter : int * (int -> int) -> (int -> int)
= fun (n,f) ->
(int -> int)
は何を意味するのでしょうか?
括弧はタイプ(int -> int)
の機能の間が明確になっている...私は関数自体が引数としてペアを受け取る理解し、私は完全に括弧が何を意味するのか理解していない - それはパラメータにとり意味しますint
と入力し、int
を返します。おそらく2つの通常のint
をその関数のパラメータとして返します。たとえば、最初の括弧がない場合は、iter
は(int, int)
のタプルを想定し、他のパラメータがない場合は戻り値の型としてint -> int -> int
が必要です。
括弧の2番目のペアは厳密には必要ではありませんが、関数の返り値として期待していることを示す良い指標になります。その括弧のペアがなければ、関数は(int, int -> int)
のタプルと、もう1つのint
を期待して読み取ることができ、例えばint
を返します。
あなたiter
と同じシグネチャを持つ関数の例は次のようになります。
let random_func: int * (int -> int) -> (int -> int) =
fun (n, f) -> f
検索TL; DR以下。
MLの言葉に根ざしたラムダの計算(私に同行してください)では、コアアイデアはアプリケーションの抽象化または関数の引数へのマッピングに関するものです。 引数が1つだけの場合。
λx[x + 1]
上記でλ
がx
の値を待っているアプリケーションに機能x + 1
を抽象化読み出し、変化からそれを守る、及び適用(値を持つ関数でx
を交換して計算)。タイプint -> int
、または入力タイプint
と出力タイプint
を有する
fun x -> x + 1
:
OCamlの上記は、と同等であろう。さて、ラムダは一度に1つの議論しか扱っていません。これは、x*x -2*x + c
(多項式関数x2 − 2·x + c
)のような複数の引数を持つ関数ではどうなりますか?以前と同じように、引数を1つずつ評価します。
λc[λx[x*x - 2*x + c]]
したがって、前のアプリケーションの出力は次の入力の入力となります。以下同様です。
fun c 3 -> (3 * 3) - (2 * 3) + c
fun c -> 9 - 6 + c
fun c -> 3 + c
:あなたが部分的に引数
x = 3
に関数を適用した場合、あなたはそのような機能低下を得る - OCamlのと同等の機能が
int -> int -> int
または
(int -> int) -> int
(>出力入力の連鎖)を入力してい
fun c x -> (x * x) - (2 * x) + c
だろう
結果の関数のタイプはint -> int
となります。これはカレー加工の基礎です。最初は混乱しているように見えるかもしれませんが、命令言語では非常に有用であり、評価されていません。たとえば、あなたがこのような何かを行うことができます:
let waiting_for_c_and_x = fun c x -> 2*x + c
let waiting_for_c = waiting_for_c_and_x 10 in
let result = waiting_for_c 2 (* result = 22 *)
TL; DRを
しかし、グループへの入力のこれらの鎖を括弧を使用して/出力はトリッキーが、OCamlでは必要なため、現実には、コンパイラはできません〜から推測するint * int -> int
あなたは、入力としてint * int
ペアを受け入れ、書くことができます(私たちは(int * int) -> int
として括弧ができます)出力としてint
または引数としてint
一対の種類int -> int
の機能を受け入れるものを(返すアプリケーションを意味している場合int * (int -> int)
)。
この特定のケースでは、カッコを付けずに説明すると、関数は整数に対を期待し、 'int - >型の関数を返しますint - > int'であるため、 '*'は ' - >'の方が優先度が高いからです。 – Lhooq
から '(INT - > int)が' 'int'へint''から機能のタイプです。 – gallais
@gallaisはあまり役に立たなかった。 – PieOhPah
あなたが何を求めているのかは明らかではありません... – gallais