这个编译器如:
let test Xf Yf = Xf + Yf
这个编译器不喜欢:
let test Xfd Yfd = Xfd + Yfd
警告: 大写变量标识符通常不应在模式中使用,并且可以指示拼写错误的模式名称。
也许我没有正确搜索,但我没有设法找到解释为什么这是函数参数的情况......
答案 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
例如,。不太确定为什么第三个字母会触发警告