这段代码在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
。