2017-10-13 13 views
0

私はOCamlで授業をしていますが、表現の意味に関する質問がありました。(int - > int) - >(int - > int)はどういう意味ですか?

私は、例えば、書いた場合、関数を定義する場合:

let iter : int * (int -> int) -> (int -> int) 
= fun (n,f) -> 

(int -> int)は何を意味するのでしょうか?

+0

から '(INT - > int)が' 'int'へint''から機能のタイプです。 – gallais

+1

@gallaisはあまり役に立たなかった。 – PieOhPah

+0

あなたが何を求めているのかは明らかではありません... – gallais

答えて

4

括弧はタイプ(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 
1

検索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))。

アプライドStanford Encyclopedia of Philosophy (very good read)

+0

この特定のケースでは、カッコを付けずに説明すると、関数は整数に対を期待し、 'int - >型の関数を返しますint - > int'であるため、 '*'は ' - >'の方が優先度が高いからです。 – Lhooq

関連する問題