Ячейки типа OCaml с явным типом
В Haskell считается хорошей практикой явно объявлять сигнатуру типа ваших функций, даже если она может (обычно) быть выведена. Кажется, что это невозможно даже в OCaml, например.
val add : int -> int -> int ;;
дает мне ошибку. (Хотя я могу сделать модули type
, которые дают только подписи.)
- Правильно ли, что это невозможно сделать в OCaml?
- Если да, то почему? Система типов OCaml не кажется невероятно отличной от Haskell.
Ответы
Ответ 1
OCaml имеет два способа указания типов, их можно сделать inline:
let intEq (x : int) (y : int) : bool = ...
или они могут быть помещены в файл интерфейса, как вы это делали:
val intEq : int -> int -> bool
Я считаю, что последнее предпочтительнее, поскольку оно более четко отделяет спецификацию (тип) от реализации (кода).
Ссылки: OCaml для Haskellers
Ответ 2
Im general, синтаксис let
- привязать значение с ограниченным типом:
let val : constraint = e ...
Применительно к функции вы можете указать подпись следующим образом:
let add : int -> int -> int = fun x y -> ...
Это аналогично синтаксису, требуемому для ограничения модуля сигнатурой:
module Mod
: sig ... end
= struct ... end