Конструктор F # не принимает кортежи? - PullRequest
9 голосов
/ 09 июля 2011

Я попытался использовать кортеж для создания нового экземпляра класса, определенного в 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 Член или объект конструктор "тест" не занимает 1 аргумент (ы). Перегрузка была найдена принимая 2 аргумента.

Если я удаляю конструктор не по умолчанию, все в порядке. Я не понимаю, почему это становится двумя / тремя аргументами вместо кортежей.

Большое спасибо.

Ответы [ 2 ]

5 голосов
/ 09 июля 2011

Может быть более простой синтаксис, чтобы заставить это работать, но я не знаю, что это:

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)
3 голосов
/ 10 июля 2011

Это тонко, но согласно спецификации.Вот старый ответ по электронной почте, который я выкопал, где кто-то задал похожий вопрос:

...

Во время игры есть также (тонкая) разница между "кортежами" (на языке F #)и «синтаксические кортежи» (в спецификации F #).

Разрешение приложения метода отличается при перегрузках.Если их нет, декомпозиция аргумента (т. Е. «Материал», указанный между (и) в вызове метода) в форму кортежа не происходит, поэтому компилятор счастлив и говорит «о, хорошо, ctor для MyClass принимает1 аргумент (кортеж), и я вижу 1 аргумент («кортеж» в вашем коде), поэтому я буду использовать это ".

Принимая во внимание, что когда у вас есть 2 перегрузки, правило, приведенное выше, больше не применяетсяи компилятор попытается разложить аргумент в форму кортежа (который в вашем случае разрешит что-то вроде: «О, хорошо, есть 1 аргумент, который является кортежем. Но подождите, у меня есть 2 перегрузки. И ваш список аргументов (один элемент (кортеж) не соответствует ни одному из списков аргументов, поэтому сообщение об ошибке "

По крайней мере, такова моя интерпретация F # спецификации , раздел 14.4.

...