Вы можете, используя либо этот синтаксис, либо альтернативный:
let b = (C foo : t)
Добавление ограничений типа таким способом обычно не служит какой-либо цели в правильно сформированной программе, поскольку алгоритм вывода типа можетсправиться со всем этим самостоятельно.Есть несколько исключений (в основном связанных с объектно-ориентированной стороной), но они довольно редки.
Такие аннотации в основном полезны, когда возникает ошибка типа, и вам нужно понять, почему определенное выражение имеет определенноевведите, когда вы ожидали, что оно будет иметь другое, поскольку вы можете аннотировать промежуточные значения, чтобы ошибка типа перемещалась вверх по исходному коду.
Обратите внимание, что существует другой способ аннотирования типов, который заключается в определении сигнатурыдля ваших модулей.В приведенном выше примере тело вашего модуля будет содержать:
let b = C foo
А подпись вашего модуля будет содержать:
val b : t
Это особенно полезно, когда необходимо, чтобы предположения внутри модуля были невидимымив другие модули.Например, при использовании полиморфных вариантов:
let user_type = `Admin
Здесь вы хотите обрабатывать только учетную запись администратора, но вам нужно, чтобы остальная часть кода знала, что существуют другие типы учетных записей, поэтому вы должны написать вподпись, что:
val user_type : [`Admin|`Member|`Guest]
Этот тип технически корректен, но не мог быть угадан алгоритмом вывода типа.