为什么这个F#/ OCaml"匹配"表达式编译?

Pra*_*hav 8 f# ocaml pattern-matching

这段代码在F#和OCaml中编译得很好:

let testmatch k =
    match k with
    | jqk3jtl23jtlk123 -> true
Run Code Online (Sandbox Code Playgroud)

我在FSI和utop都进行了测试.它总是回归true.

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

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

  • 为什么编译器接受完全随机的文字jqk3jtl23jtlk123
  • 为什么我没有获得无穷无尽的比赛警告?
  • 这场比赛实际上是做什么的?

Hon*_*tan 15

在这种情况下,"literal" jqk3jtl23jtlk123是一个有效的变量名称,因此->描述左边的模式与您编写的模式相同let jqk3jtl23jtlk123 = k.由于它接受任何值k,并且不限制其类型,因为绑定适用于所有类型,因此推断类型是'a类型系统可以表示的最通用值.

如果将文字转换为非有效标识符,例如以数字开头,则无法编译.

如果你用引号包装文字,它将被解释为一个字符串值文字,你应该得到无穷无尽的匹配警告,它将约束k的类型string.


Éti*_*lon 10

这是一个通配符模式,用于命名k等于的任何模式.这相当于

let testmatch k =
    let jqk3jtl23jtlk123 = k in
    true
Run Code Online (Sandbox Code Playgroud)