我尝试使用元组来创建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 回答
这是微妙的,但根据规范 . 这是我挖出的旧电子邮件回复,有人问了类似的问题:
...
在游戏中,“元组”(在F#语言中)和“语法元组”(在F#规范中)之间也存在(微妙)差异 .
当存在重载时,方法应用程序解析是不同的 . 如果没有,则参数的分解(即在方法调用中在(和)之间指定的“东西”)不会发生,因此编译器很高兴并且说“哦,好吧,MyClass的ctor需要1个参数(一个元组),我看到1个参数(代码中的“元组”)所以我将使用它“ .
然而,当你有2个重载时,那么上面的规则就不再适用了,编译器会尝试将参数分解为元组形式(在你的情况下会解析为:“哦,好吧,有1个参数是但是等等,我有2个重载 . 你的参数列表(一个元素,元组)与参数列表都不匹配,因此错误消息“
至少,这是我对F# specification第14.4节的解释 .
可能有一种更简单的语法来实现这一点,但我不知道它是什么: