type level =
[ `Debug
| `Info
| `Warning
| `Error]
我可以在这里删除“`”吗?
此致!
答案 0 :(得分:10)
很难回答这个问题是或否。
您可以删除反引号和方括号。那么你会有
type level2 = Debug | Info | Warning | Error
在最简单的情况下,此类型与您的类型level
非常相似。它有4个常量构造函数。
在更复杂的情况下,类型是完全不同的。您的类型level
是polymorphic variant类型,比上面的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
是{{1}的子类型1}}。
非多态变体类型(如levelx
)之间没有子类型关系,事实上,您不能在同一范围内的多个此类型中使用相同的构造函数名称。
多态变体类型也可以是开放式的。这是一个很大的话题;如果您有兴趣,请参阅上面链接的OCaml手册的第4.2节。