请考虑以下代码:
type Test(a) =
member o.A = a
let test = Test(a = cos 5.)
let test2 = Test(a = 5. |> cos) // ERROR
let test3 = Test(a = (5. |> cos))
Test2行给出错误:
类型'bool'不支持任何名为'Cos'的运算符
和
未定义值或构造函数“a”
我理解错误信息,但我不知道这不是错误吗?
答案 0 :(得分:5)
认为没关系,因为(|>)的优先级小于(=)表达式
Test(a = 5. |> cos)
被解释为
Test((a = 5.) |> cos)
并且是这种情况错误消息是正确的
答案 1 :(得分:1)
F#解析器将命名参数视为相等测试表达式;编译器的后期将它们解码为命名参数。因此,它是@desco描述的优先问题。
请注意,如果你有一个布尔命名参数,你可以这样做。
F(a = true) // named param
F((a = true)) // compare local name 'a', then pass boolean as first arg
作为一种在极少数情况下需要消除歧义的方法。