type level =
[ `Debug
| `Info
| `Warning
| `Error]
Run Code Online (Sandbox Code Playgroud)
我可以在这里删除"`"吗?
祝商祺!
Jef*_*eld 10
是或否回答这个问题很难.
您可以删除反引号和方括号.然后你会的
type level2 = Debug | Info | Warning | Error
Run Code Online (Sandbox Code Playgroud)
在最简单的情况下,此类型与您的类型非常相似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
Run Code Online (Sandbox Code Playgroud)
这个例子的要点是,即使x有类型level,它也可以被视为类型levelx,因为它level是一个子类型levelx.
非多态变体类型之间没有子类型关系level2,并且实际上您不能在同一范围内的多个此类型中使用相同的构造函数名称.
多态变体类型也可以是开放式的.这是一个很大的话题; 如果您有兴趣,请参阅上面链接的OCaml手册的第4.2节.