这段代码在F#和OCaml中都可以正常编译:

let testmatch k =
    match k with
    | jqk3jtl23jtlk123 -> true


我已经在FSI和utop中进行了测试。它总是返回true

jqk3jtl23jtlk123是完全随机的,其类型推断为'a。即使我将k约束为数据类型(例如let testmatch (k: int) =),它也会编译(尽管显然将testmatch的类型约束为int -> bool而不是'a -> bool

有人可以解释发生了什么吗?特别:


为什么编译器接受完全随机的文字jqk3jtl23jtlk123
为什么我没有得到详尽的比赛警告?
比赛实际在做什么?

最佳答案

在这种情况下,“文字” jqk3jtl23jtlk123是有效的变量名,因此->左侧的模式所描述的内容与您编写let jqk3jtl23jtlk123 = k相同。由于此方法可以接受k的任何值,并且因为绑定适用于所有类型而不会限制其类型,所以推断的类型为'a,这是该类型系统可以表示的最通用的值。

如果将文字转换为不是有效标识符的内容(例如,以数字开头),则它将无法编译。

如果将文字用引号引起来,它将被解释为字符串值文字,您应该得到不尽相同的匹配警告,并将k的类型限制为string

08-28 07:07