4

考虑以下代码:

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”

我理解错误消息,但我想知道这不是错误吗?

4

2 回答 2

5

认为没关系,因为 (|>) 的优先级小于 (=) 表达式

Test(a = 5. |> cos) 

被解释为

Test((a = 5.) |> cos) 

这种情况下错误信息是否正确

于 2011-01-10T09:21:03.460 回答
1

F# 解析器将命名参数视为相等测试表达式;编译器的后期将它们解码为命名参数。因此,这是@desco 描述的优先问题。

请注意,如果您有一个布尔命名参数,您可以执行例如

F(a = true)    // named param
F((a = true))  // compare local name 'a', then pass boolean as first arg

作为在极少数情况下消除歧义的一种方式,它是必需的。

于 2011-01-10T17:58:24.527 回答