Ocaml 什么';有无反勾号的区别是什么`&引用;?

Ocaml 什么';有无反勾号的区别是什么`&引用;?,ocaml,Ocaml,我可以删除这里的“`”吗 真诚的 这个问题很难回答是或否 可以删除反勾号和方括号。那你会的 type level = [ `Debug | `Info | `Warning | `Error] 在最简单的情况下,此类型非常类似于您的类型级别。它有4个常量构造函数 然而,在更复杂的情况下,类型却大不相同。您的类型level是一种比上面的level2更灵活的类型。level的构造函数可以出现在同一范围内的任意数量的不同类型中,level参与子类型关系: type level2 = Debug |

我可以删除这里的“`”吗


真诚的

这个问题很难回答是或否

可以删除反勾号和方括号。那你会的

type level =
[ `Debug
| `Info
| `Warning
| `Error]
在最简单的情况下,此类型非常类似于您的类型
级别
。它有4个常量构造函数

然而,在更复杂的情况下,类型却大不相同。您的类型
level
是一种比上面的
level2
更灵活的类型。
level
的构造函数可以出现在同一范围内的任意数量的不同类型中,
level
参与子类型关系:

type level2 = Debug | Info | Warning | Error
#类型级别=[`Debug |`Info |`Warning |`Error]
#键入levelx=[`Debug |`Info |`Warning |`Error |`Fatal]
#设isfatal(l:levelx)=l=`Fatal;;
val是致命的:levelx->bool=
#设(x:level)=`Info;;
val x:level=`Info
#是致命的(x:>levelx);;
-:bool=false
此示例的要点是,即使x具有类型
level
,也可以将其视为类型
levelx
,因为
level
levelx
的子类型

level2
这样的非多态变量类型之间不存在子类型关系,事实上,您不能在同一范围内的多个此类类型中使用相同的构造函数名称


多态变体类型也可以是开放式的。这是一个大话题;如果您感兴趣,请参阅上面链接的OCaml手册第4.2节。

这与:afair有关(有些),现在更喜欢的名称是“开放变体”。我认为开放变体指的是例外情况之类的东西?levelx是否也需要是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