我最近一直在學習OCaml,截至目前看起來編譯器使用了一個箭頭來表示下一個類型是什麼。例如,int -> int -> <fun>
是一個返回整數的整數,它返回一個函數。OCaml中的箭頭「 - >」的目的是什麼?OCaml
但是,我想知道我是否可以在OCaml代碼中本地使用它。此外,如果有人會碰巧知道它的適當名稱。謝謝。
我最近一直在學習OCaml,截至目前看起來編譯器使用了一個箭頭來表示下一個類型是什麼。例如,int -> int -> <fun>
是一個返回整數的整數,它返回一個函數。OCaml中的箭頭「 - >」的目的是什麼?OCaml
但是,我想知道我是否可以在OCaml代碼中本地使用它。此外,如果有人會碰巧知道它的適當名稱。謝謝。
該運算符通常稱爲類型箭頭,其中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」。
你是什麼意思的「本身使用它」?當然,您可以在明確寫下類型簽名時使用它。 – Bergi
你的意思是複製粘貼的東西是這樣的:'let f a b = a + b ;; val f:int - > int - > int =',其中'int - > int - > int'是f的類型。你可以忽略'= '部分,這意味着非正式地顯示'f'的值。 –