首页 文章

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

提问于
浏览
9

我尝试使用元组来创建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个参数 .

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

非常感谢你 .

2 回答

  • 3

    这是微妙的,但根据规范 . 这是我挖出的旧电子邮件回复,有人问了类似的问题:

    ...

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

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

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

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

  • 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)
    

相关问题