我尝试使用元组来创建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 参数(一个或多个)。发现了一个重载 拿两个论点。
如果我删除非默认构造函数,一切都很好。 我不明白为什么它变成两个/三个参数而不是元组。
非常感谢。
答案 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节的解释。