Какая разница с или без обратного хода "?"?

type level =
[ `Debug
| `Info
| `Warning
| `Error]

Можно ли удалить "`" здесь?

С уважением!

Ответ 1

Трудно ответить на этот вопрос: да или нет.

Вы можете удалить обратные и квадратные скобки. Тогда у вас будет

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, связанный выше.