2011-07-09 29 views
9

F # içinde tanımlı bir sınıfın yeni bir örneğini oluşturmak için bir tuple kullanmayı denedim. Sorunu çoğaltmak için aşağıdaki kodu denedim.F # constructor, tuplleri kabul etmiyor mu?

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) 

Bu

hata 1 elemanı ya da şantiye 'test' nesne 1 bağımsız değişken (ler) almaz şikayet etmektedir. Bir aşırı yüklenme 2 argüman alarak bulundu.

Varsayılan olmayan yapıcıyı kaldırırsam, işler iyi olur. Neden tuples yerine iki/üç argüman haline geldiğini anlamıyorum.

Çok teşekkür ederim.

cevap

3

Bu ince ama spec başına.

... oyun At

(F # dilinde) "küpe" ve "sözdizimsel küpe arasındaki (ince) fark da var olduğunu: Burada birileri benzer bir soru sordu nerede kazılıp eski e-posta yanıtı var "(F # belirtiminde).

Aşırı yük olduğunda, yöntem uygulama çözünürlüğü farklıdır. Hiçbiri yoksa, argümanın ayrıştırılması (yani, metot çağırma işleminde (ve) arasında belirtilen "malzeme") bir tuple formunda gerçekleşmez, bu yüzden derleyici mutlu olur ve "oh tamam, MyClass için ctor alır 1 argüman (bir tuple) ve ben 1 argümanını (kodunuzda "tuple") görüyorum, böylece bunu kullanacağım ".

2 aşırı yüklenme olduğunda, yukarıdaki kural artık geçerli değildir ve derleyici argümanı bir tuple formuna ayırmaya çalışacaktır (sizin durumunuzda şu gibi bir şey çözülür: "Tamam, var 1 argüman olan tuple.Ama bekle, 2 aşırı yüküm var ve argüman listeniz (bir eleman, tuple) bir argüman listesiyle eşleşmiyor, dolayısıyla hata mesajı "

En azından, benim yorumumdur. F# specification, bölüm 14.4

+2

Derleyicinin yapıyı iyileştirmediğine şaşırmadım ya da bu durumda bir tuple olarak argüman, ama ben yapıcı bağlanma örüntülerini kullanamazsınız oldukça şaşırdım yani 'tür Test ((x, y)) = ...' (ya da başka desen). Bunun için bir sebep var mı? –

+0

İyi soru, bilmiyorum. – Brian

+0

Çok teşekkürler. F #, bazı yönlerden gerçekten kafa karıştırıcı. – LLS

5

bu çalışma almak için daha kolay bir sözdizimi olabilir, ama bunun ne olduğunu bilmiyorum:

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) 
+0

Teşekkür ederim. Bir parantez çiftindeki çoklu argümanların tuple aynı olduğunu düşünmüştüm. – LLS

İlgili konular