问题 有或没有反引号“?”有什么区别?


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

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

祝商祺!


8039
2017-11-22 02:54


起源

这与(某种程度上)相关: stackoverflow.com/questions/1746743/... - Rémi


答案:


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

您可以删除反引号和方括号。然后你会的

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节。


10
2017-11-22 03:52



此外,现在更可取的名称是“开放变种”。 - ygrek