使用F#的类型中的构造函数的命名参数

时间:2011-01-10 09:17:45

标签: f# constructor types arguments named-parameters

请考虑以下代码:

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”

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

2 个答案:

答案 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

作为一种在极少数情况下需要消除歧义的方法。