什么是有没有反叛的区别"`"?

时间:2011-11-22 02:55:00

标签: ocaml

type level =
[ `Debug
| `Info
| `Warning
| `Error]

我可以在这里删除“`”吗?

此致!

1 个答案:

答案 0 :(得分:10)

很难回答这个问题是或否。

您可以删除反引号和方括号。那么你会有

type level2 = Debug | Info | Warning | Error

在最简单的情况下,此类型与您的类型level非常相似。它有4个常量构造函数。

在更复杂的情况下,类型是完全不同的。您的类型levelpolymorphic 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节。