在Haskell中,明確聲明函數的類型簽名被認爲是很好的做法,儘管它可以(通常)被推斷出來。看起來這在OCaml中甚至是不可能的,例如,OCaml顯式類型簽名
val add : int -> int -> int ;;
給了我一個錯誤。 (雖然我可以讓type
模塊,這些模塊只給簽名。)
- 我是正確的,這是不可能的OCaml中怎麼辦?
- 如果是這樣,爲什麼? OCaml的類型系統似乎與Haskell不同。
在Haskell中,明確聲明函數的類型簽名被認爲是很好的做法,儘管它可以(通常)被推斷出來。看起來這在OCaml中甚至是不可能的,例如,OCaml顯式類型簽名
val add : int -> int -> int ;;
給了我一個錯誤。 (雖然我可以讓type
模塊,這些模塊只給簽名。)
OCaml有指定類型的方法,它們可以在線完成:
let intEq (x : int) (y : int) : bool = ...
或者可以將它們放置在一個接口文件,因爲你做了:
val intEq : int -> int -> bool
我相信後者是首選,因爲它更清楚地將規範(類型)與實現(代碼)分開。
林一般情況下,語法let
-bind值與約束類型:
let val : constraint = e ...
應用到的功能,你可以指定簽名如下:
let add : int -> int -> int = fun x y -> ...
這類似於將模塊約束爲簽名所需的語法:
module Mod
: sig ... end
= struct ... end
後一個選項不再是有效的選項。至少OCaml 4.04.0不支持它。每個人都應該使用第一個選項。 – 2017-11-03 20:40:32