Явный тип var в OCaml - PullRequest
       5

Явный тип var в OCaml

2 голосов
/ 06 ноября 2010

Если у меня есть тип t

type t = C of string;;

И я хочу явно определить тип переменной типа t:

let b : t = C 'MyString';;

Могу ли я сделать это в OCaml?

Ответы [ 2 ]

11 голосов
/ 06 ноября 2010

Вам не нужно нужно , чтобы быть явным

let b = C mystring
let b = C "a string litteral"

Вы можете быть явным, но это ничего не добавляет

let b : t = C foo

В общем, предпочтительным способом является использование вывода типов без аннотирования типов, и следует указывать только тип идентификаторов, экспортируемых в другие модули, через связанный файл интерфейса .mli.

В этом случае аннотация типа ничего не добавляет, так как конструктор C уже является своего рода тегом / аннотацией: C something обязательно имеет тип t, возможной путаницы нет.

5 голосов
/ 08 ноября 2010

Вы можете, используя либо этот синтаксис, либо альтернативный:

let b = (C foo : t)

Добавление ограничений типа таким способом обычно не служит какой-либо цели в правильно сформированной программе, поскольку алгоритм вывода типа можетсправиться со всем этим самостоятельно.Есть несколько исключений (в основном связанных с объектно-ориентированной стороной), но они довольно редки.

Такие аннотации в основном полезны, когда возникает ошибка типа, и вам нужно понять, почему определенное выражение имеет определенноевведите, когда вы ожидали, что оно будет иметь другое, поскольку вы можете аннотировать промежуточные значения, чтобы ошибка типа перемещалась вверх по исходному коду.

Обратите внимание, что существует другой способ аннотирования типов, который заключается в определении сигнатурыдля ваших модулей.В приведенном выше примере тело вашего модуля будет содержать:

let b = C foo 

А подпись вашего модуля будет содержать:

val b : t

Это особенно полезно, когда необходимо, чтобы предположения внутри модуля были невидимымив другие модули.Например, при использовании полиморфных вариантов:

let user_type = `Admin

Здесь вы хотите обрабатывать только учетную запись администратора, но вам нужно, чтобы остальная часть кода знала, что существуют другие типы учетных записей, поэтому вы должны написать вподпись, что:

val user_type : [`Admin|`Member|`Guest]

Этот тип технически корректен, но не мог быть угадан алгоритмом вывода типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...