Трудно ответить на этот вопрос, да или нет.
Вы можете убрать пометки и квадратные скобки. Тогда у вас будет
type level2 = Debug | Info | Warning | Error
В простейших случаях этот тип очень похож на ваш тип level
. Имеет 4 постоянных конструктора.
Однако в более сложных случаях типы совершенно разные. Ваш тип level
является полиморфным вариантом типа, который является более гибким, чем level2
выше. Конструкторы level
могут появляться в любом количестве различных типов в одной и той же области видимости, а level
участвует в отношениях подтипов:
# type level = [`Debug | `Info | `Warning | `Error]
# type levelx = [`Debug | `Info | `Warning | `Error | `Fatal]
# let isfatal (l: levelx) = l = `Fatal;;
val isfatal : levelx -> bool = <fun>
# let (x : level) = `Info;;
val x : level = `Info
# isfatal (x :> levelx);;
- : bool = false
Смысл этого примера в том, что, хотя x имеет тип level
, он может обрабатываться так же, как если бы он имел тип levelx
, поскольку level
является подтипом levelx
.
Не существует отношений подтипов между неполиморфными типами вариантов, такими как level2
, и фактически вы не можете использовать одно и то же имя конструктора в нескольких таких типах в одной и той же области видимости.
Полиморфные типы вариантов также могут быть открытыми. Это большая тема; если вы заинтересованы, вы должны увидеть раздел 4.2 руководства OCaml, ссылка выше.