2017-03-15 12 views
2

私は最近OCamlを学びましたが、今のところ、矢印はコンパイラが次のタイプを示すために使用されているようです。たとえば、int -> int -> <fun>は、関数を返す整数を返す整数です。OCamlの矢印の目的は何ですか

しかし、OCamlコードでネイティブに使用できるかどうかは疑問でした。さらに、もし誰かがそれにふさわしい名前を知っているのであれば。ありがとうございました。

+0

「ネイティブで使用する」とはどういう意味ですか?もちろん、型シグネチャを明示的に書き留めるときに使用することができます。 – Bergi

+0

あなたがコピー貼り付けをするのは次のようなものです: 'let f a b = a + b ;; val f:int - > int - > int = '、' int - > int - > int'は 'f'の型です。 '= '部分は無視できます。これは 'f'の値を非公式に表示するためのものです。 –

答えて

4

通常、演算子はタイプ矢印と呼ばれ、T1 -> T2は、タイプT1からタイプT2の関数を表します。たとえば、+のタイプはint -> (int -> int)です。なぜなら2つの整数を取り、別の整数を返すからです。

方法は->と定義されていますが、関数は常に1つの引数をとり、1つの要素のみを返します。複数のパラメータを持つ関数は、単項関数のシーケンスに変換できます。 1 + 2と解釈することができます(OCamlコマンドラインで(+) 1を評価することで作成できます)。このテクニックは、「カリング」または「部分評価」と呼ばれます。

は、用語を評価する際のは、OCamlでの出力を見てみましょう:

# 1 + 2;; 
- : int = 3 

# (+) 1 ;; 
- : int -> int = <fun> 

用語1+2が整数型であると3の価値を持っており、用語(+) 1は整数の整数から機能です。しかし、後者は関数なので、OCamlは単一の値を出力できません。プレースホルダとして、<fun>が印刷されますが、タイプは=のままです。

あなたは楽しいキーワードで独自の関数を定義することができます。

# (fun x -> x^"abc");; 
- : bytes -> bytes = <fun> 

これは、与えられた文字列xに「abc」が追加機能です。構文を分けてみましょう:xの関数を定義し、xという文字列をtermのように定義することができます。 let f = fun x -> ...は少し面倒ですので

# let append_abc = (fun x -> x^"abc") ;; 
val append_abc : bytes -> bytes = <fun> 

、あなたも書くことができます:あなたが使用することができますどのような場合には

let append_abc x = x^"abc" ;; 
val append_abc : bytes -> bytes = <fun> 

を、時には我々は、我々はlet建設を使用し、関数名をさせていただきたいと思いあなたの新しい関数を次のように

# append_abc "now comes:" ;; 
- : bytes = "now comes:abc" 

を変数x"now comes:"に置き換えられ、私たちはEXPを得ます領域:

```now comes:```^"abc" 

「今すぐ:abc」と評価されます。

関連する問題