NONE
не конструктор, а просто подтип 'a option
Я не думал, что неправильно говорить, что NONE
является конструктором значения / шаблонавведите 'a option
.Я не уверен, что хочет сказать ваш профессор, но, возможно, дело в том, что 'a option
- это на самом деле семья / коллекция типов.NONE
- это конструктор значений / шаблонов каждого типа 'a option
для конкретных значений 'a
, но, поскольку NONE : 'a option
, даже если он не принимает никаких параметров value , он принимает параметр типа (например, int
для int option
), что делает его вид выше.
Стандартный ML не имеет синтаксисадля описания типа оператора типа, такого как option
, но в Haskell мы бы сказали, что option
имеет вид * -> *
, а int option
имеет вид *
.Возвращаясь к NONE : 'a option
, вы можете конкретизировать что это не то, чтобы получить то, что однозначно будет конструктором значения / шаблона одного типа.
Это если вы в типетеория.Более простое и менее точное представление состоит в том, что {NONE
} является подмножеством значений типа 'a option
, и что это подмножество по структуре эквивалентно типу unit
, {()
} .Но NONE
, как элемент этого подмножества, вовсе не является подтипом или типом.Это конструктор value и pattern в зависимости от того, где вы его используете:
fun isSome NONE = false
| isSome (SOME _) = true
Здесь NONE
используется в шаблоне.
fun map f NONE = NONE
| map f (SOME x) = SOME (f x)
Здесь NONE
используется в шаблоне с левой стороны и в качестве значения с правой стороны.
Возможно, кто-то с большим опытом в теории типов может исправить меня.
- isSome NONE;
stdIn:1.2-23.4 Error: operator and operand do not agree [tycon mismatch]
Похоже, у вас есть два противоречивых определения 'a option
, одно из которых вы сделали сами, а другое из стандартной библиотеки.Функции стандартной библиотеки, такие как isSome
, работают только с типом, определенным стандартной библиотекой, поэтому, если вы объявите свой собственный datatype 'a option = NONE | SOME of 'a
в демонстрационных целях, это определение будет фактически конфликтовать и, следовательно, затенять встроенное, делая всестандартные функции библиотеки, которые ссылаются на него, менее полезны, так как вы не можете создавать или сопоставлять образцы со значениями непосредственно с помощью NONE
и SOME ...
, или аннотировать тип с помощью : ... option
.