Какая разница с или без обратного кавычка "` "? - PullRequest
11 голосов
/ 22 ноября 2011
type level =
[ `Debug
| `Info
| `Warning
| `Error]

Могу ли я удалить здесь "` "?

С уважением!

1 Ответ

10 голосов
/ 22 ноября 2011

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

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

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, ссылка выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...