type level =
[ `Debug
| `Info
| `Warning
| `Error]
我可以在这里删除“`”吗?
祝商祺!
type level =
[ `Debug
| `Info
| `Warning
| `Error]
我可以在这里删除“`”吗?
祝商祺!
是或否回答这个问题很难。
您可以删除反引号和方括号。然后你会的
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
,实际上,您不能在同一范围内的多个此类型中使用相同的构造函数名称。
多态变体类型也可以是开放式的。这是一个很大的话题;如果您有兴趣,请参阅上面链接的OCaml手册的第4.2节。