2010-11-06 1 views
2

Если у меня есть тип TЯвный тип вар в OCaml

type t = C of string;;

И хотите явно определить тип переменной быть типа т:

let b : t = C 'MyString';;

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

+5

На самом деле, 'let b: t = Var 'MyString' ;;' будет компилироваться, если вы приложите усилия для устранения проблем, которые вы должны были исправить при редактировании вашего вопроса. Строки заключены в '' ', и ваш конструктор называется' C', а не 'Var'. –

ответ

11

Вы не необходимости быть явно

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

Вы можете быть явным, но ду oesn't добавить что-нибудь

let b : t = C foo 

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

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

5

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

let b = (C foo : t) 

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

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

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

let b = C foo 

И ваш модуль подпись должна содержать:

val b : t 

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

let user_type = `Admin 

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

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

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