2

这个编译器喜欢:

let test Xf Yf = Xf + Yf

这个编译器不喜欢:

let test Xfd Yfd = Xfd + Yfd

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

也许我没有正确使用谷歌搜索,但我没有设法找到任何解释为什么函数参数会出现这种情况的东西......

4

2 回答 2

6

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

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

type Side = 
  | Left 
  | Right

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

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

代码中有一个错字——我刚刚写的Lef——但代码仍然有效,因为Lef可以解释为一个新变量,因此匹配分配任何一侧Lef并始终运行第一个案例。关于大写标识符的警告有助于避免这种情况。

于 2012-05-25T09:49:47.393 回答
1

F# 尝试强制执行活动模式的大小写规则 - 考虑这段代码的作用

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

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

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

例如。不太清楚为什么第三个字母会触发警告

于 2012-05-25T08:08:21.187 回答