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)