OCaml явные подписи типа - PullRequest
28 голосов
/ 15 мая 2011

В Haskell считается хорошей практикой явно объявлять сигнатуру типа ваших функций, даже если она (обычно) может быть выведена.Кажется, что это даже невозможно в OCaml, например,

val add : int -> int -> int ;;

дает мне ошибку.(Хотя я могу сделать type модули, которые дают только подписи.)

  1. Правильно ли я в том, что это невозможно сделать в OCaml?
  2. Если так, почему?Система типов OCaml не кажется невероятно отличной от Haskell.

Ответы [ 2 ]

44 голосов
/ 15 мая 2011

OCaml имеет два способа указания типов, они могут быть встроены:

let intEq (x : int) (y : int) : bool = ...

или они могут быть помещены в файл интерфейса, как вы сделали:

val intEq : int -> int -> bool

Я полагаю, что последний предпочтительнее, поскольку он более четко отделяет спецификацию (тип) от реализации (кода).


Рекомендации : OCaml для Haskellers

16 голосов
/ 15 мая 2011

В общем, синтаксис для let -привязать значение с ограниченным типом:

let val : constraint = e ...

Применительно к функции вы можете указать подпись следующим образом:

let add : int -> int -> int = fun x y -> ...

Это аналогично синтаксису, необходимому для ограничения модуля подписью:

module Mod
  : sig    ... end
  = struct ... end
...