Я прочитал в этом посте , что диалекты ML не допускают использование переменных типа неосновного типа. Например, последнее утверждение не представимо:
-- Haskell code
type Ground = Int
type FirstOrder a = Maybe a
type SecondOrder c = c Int -- ML do not allow :c
OCaml имеет поддержку более высокого уровня только на уровне модулей. Есть некоторые объяснения ( здесь и комментарий автора здесь ) о том, какие особенности OCaml конфликтуют с возможностью использования типов с более высоким родом.
Если я правильно понял, основноепроблема заключается в следующих фактах:
- OCaml не придерживается ограничения «свежести» для определений типов: конструкция
type
может определять как псевдоним (тип останется прежним), так и новыйfresh type - определение псевдонима типа может быть скрыто
AFAIK, Standard ML имеет различные конструкции для определения типа и псевдонимов: type
для псевдонимов и datatype
для введения новых свежих типов.
К сожалению, я недостаточно хорошо знаю SML - возможно ли экспортировать псевдонимы типов со скрытым определением? И может кто-нибудь показать мне, если есть какие-то другие функции SML, которые все еще не подходят для возможности типов с более высоким родом?
Вероятно, будут некоторые проблемы с функторами - Можно ли было бы так любезнопоказать пример кода этого? Я слышал несколько раз о таких случаях, но до сих пор не нашел полный пример этого.