【问题标题】:Named arguments of a constructor in a type using F#使用 F# 的类型中的构造函数的命名参数
【发布时间】:2011-06-06 10:08:53
【问题描述】:

考虑以下代码:

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”

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

【问题讨论】:

    标签: f# constructor types arguments named-parameters


    【解决方案1】:

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

    Test(a = 5. |> cos) 
    

    被解释为

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

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

    【讨论】:

    • 但我不认为“=”在这里是等号,是吗?等号在这里意味着什么?:Test(a = cos 5.)。我希望“=”与“let a = 5. |> cos”一样,并且优先级应该是相应的。我错了吗?
    • x = y 是一个布尔表达式(a = 5. 也是),而let x = value 绑定一个值。
    • 顶级的=(紧接在括号内)被解释为命名参数或字段/属性分配。任何其他地方都被视为平等测试。
    • MizardX:所以如果它是一个字段/属性分配,它应该有一个分配优先级。我说的对吗?
    • @MizardX:是的,但是由于= 的优先级,a = 5. |> cos 被解析为cos (a = 5.)not 被解析为a = (5. |> cos)
    【解决方案2】:

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

    请注意,如果你有一个布尔命名参数,你可以这样做,例如

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

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

    【讨论】:

    • ... 和 F(a = (a = true)) 也是可能的。不过看起来有点好笑:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多