F#构造函数不接受元组?

时间:2011-07-09 18:27:26

标签: f# constructor tuples

我尝试使用元组来创建F#中定义的类的新实例。为了复制问题,我尝试了以下代码。

type test(x: int, y:int) =
    let distance =
        x * x + y * y |> float |> sqrt
    new (x: int, y:int, z:int) =
        new test(x, y)
let args = 1, 2
let test2 = new test(args)

它抱怨

  

错误1成员或对象   构造函数'test'不需要1   参数(一个或多个)。发现了一个重载   拿两个论点。

如果我删除非默认构造函数,一切都很好。 我不明白为什么它变成两个/三个参数而不是元组。

非常感谢。

2 个答案:

答案 0 :(得分:5)

可能有一种更简单的语法来实现这一点,但我不知道它是什么:

type Test(tup : int*int) =
    let x, y = tup
    let distance =
        x * x + y * y |> float |> sqrt
    new (tup : int*int*int) =
        let x, y, _ = tup
        new Test((x, y))

let args1 = 1, 2
let test1 = new Test(args1)

let args2 = 3, 4, 5
let test2 = new Test(args2)

答案 1 :(得分:3)

这很微妙,但符合规范。这是一个旧的电子邮件回复我挖出来的,有人问了类似的问题:

...

在游戏中,“元组”(在F#语言中)和“语法元组”(在F#规范中)之间也存在(细微)差异。

当存在重载时,方法应用程序解析会有所不同。如果没有,则参数的分解(即在方法调用中在(和)之间指定的“东西”)不会发生,因此编译器很高兴并且说“哦,好吧,MyClass的ctor需要1个参数(一个元组),我看到1个参数(代码中的“元组”)所以我将使用它。“

然而,当你有2个重载时,那么上面的规则不再适用了,编译器会尝试将参数分解为元组形式(在你的情况下会解析为:“哦,好吧,有1个参数是元组。但是等等,我有2个重载。你的参数列表(一个元素,元组)与参数列表都不匹配,因此错误消息“

至少,这是我对F# specification第14.4节的解释。