2017-09-15 51 views
8

此代码编译的F#就好以及OCaml的:为什么这个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
  • 为什么我没有得到一个非穷尽匹配的警告?
  • 什么是真正在做什么?
  • 比赛
+7

你不匹配对价值'jqk3jtl23jtlk123',你要创建一个名为'jqk3jtl23jtlk123'值匹配任何'k'是。 – Marth

+2

在这些语言中,您通常处于值表达式或模式匹配表达式中,并且这两种行为有所不同。模式匹配发生在'match ... with'之后,'function'之后,以及任何函数/方法参数中。 – TheQuickBrownFox

回答

15

在这种情况下,“文字”jqk3jtl23jtlk123是一个有效的变量名称,因此->左侧的图案与您写入let jqk3jtl23jtlk123 = k时的图案相同。由于它接受任何值k,并且不约束其类型,因为绑定适用于所有类型,推断类型为'a,这是类型系统可以表示的最通用的值。

如果您将文字变成某种不是有效的标识符的东西,例如以数字开头,它将无法编译。

如果将文字包装在引号中,它将被解释为字符串值文字,您应该得到无穷无尽的匹配警告,并且会将k的类型限制为string

9

这是一个通配符模式,其名称与k相等。这相当于

let testmatch k = 
    let jqk3jtl23jtlk123 = k in 
    true 
相关问题