Вы можете удалить обратные и квадратные скобки. Тогда у вас будет
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, связанный выше.