2017-03-15 72 views
2

我最近一直在學習OCaml,截至目前看起來編譯器使用了一個箭頭來表示下一個類型是什麼。例如,int -> int -> <fun>是一個返回整數的整數,它返回一個函數。OCaml中的箭頭「 - >」的目的是什麼?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),因爲它需要兩個整數並返回另一個整數。

定義方式->,函數總是隻帶一個參數,並且只返回一個元素。具有多個參數的函數可以被轉換成一系列一元函數。我們可以將1 + 2解釋爲創建+1遞增函數(您可以通過在OCaml命令行中評估(+) 1來創建它)編號爲2.此技術稱爲Currying或部分評估。

我們評價一個術語,當我們看在OCaml的輸出:

# 1 + 2;; 
- : int = 3 

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

術語1+2爲整數類型,並且具有3值和術語(+) 1是從整數到整數的函數。但是由於後者是一個函數,OCaml不能打印單個值。作爲一個佔位符,它只是打印<fun>,但類型是=

可以搭配的樂趣關鍵字定義自己的職能:

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

這是追加「ABC」給定的字符串x的函數。讓我們分開語法:fun x -> term表示我們定義了一個函數,其參數爲x,此x現在可以出現在term之內。有時候,我們想給函數的名字,然後我們使用let建設:

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

因爲let f = fun x -> ...是有點麻煩,你也可以這樣寫:

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

在任何情況下,你可以使用新功能如下:

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

變量x"now comes:"取代,我們得到的EXP ression:

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

其評估爲「現在來:abc」。