什么是“大写变量标识符通常不应该用于模式......”?

时间:2012-05-25 07:24:48

标签: f# compiler-warnings

这个编译器如:

let test Xf Yf = Xf + Yf

这个编译器不喜欢:

let test Xfd Yfd = Xfd + Yfd

警告:     大写变量标识符通常不应在模式中使用,并且可以指示拼写错误的模式名称。

也许我没有正确搜索,但我没有设法找到解释为什么这是函数参数的情况......

2 个答案:

答案 0 :(得分:6)

我同意这个错误信息看起来有点神秘,但它有很好的动机。根据F#命名准则,应使用PascalCase命名有区别的联合的案例,并且编译器正在尝试确保您不会在模式匹配中意外拼错案例名称。

例如,如果您有以下联合:

type Side = 
  | Left 
  | Right

当参数为Left且“错误!”时,您可以编写以下打印“ok”的函数。否则:

let foo a = 
  match a with 
  | Lef -> printfn "ok"
  | _ -> printfn "wrong!"

代码中有一个拼写错误 - 我只编写Lef - 但代码仍然有效,因为Lef可以解释为一个新变量,因此匹配将任何一方分配给{{ 1}}并且始终运行第一个案例。关于大写标识符的警告有助于避免这种情况。

答案 1 :(得分:1)

F#尝试对活动模式强制执行案例规则 - 考虑此代码执行的操作

let f X = 
    match X with
    |X -> 1
    |_ -> 2

这令人困惑。此外,函数参数类似于模式,您可以这样做

let f (a,b,_) = a,b
例如,

。不太确定为什么第三个字母会触发警告