2011-08-17 32 views
10

Aşağıdaki kod derlenmiyor. İsteğe bağlı bağımsız değişkenleri yayma

type A(?arg) = 
    member __.Arg : string option = arg 

type B(?arg) = 
    inherit A(arg) //ERROR expected type string but has type 'a option 

Ben seçeneğin yatan türün örneği sağlanmalıdır nedeni budur varsayalım, ve derleyici sözdizimi dayalı Some/ None geçen kolları.

Varsayımın doğru bir şekilde varsayıldığı varsayılırsa, bunun için bir geçici çözüm var mı? İsteğe bağlı argümanlar yaymak mümkün mü?

cevap

21

F # Spec 8.13.5'te Opsiyonel argümanlar

aşağıdaki teknikleri kullanarak isteğe bağlı bağımsız değişkenler için değerleri belirtebilir

arayanlar: İsme göre

  • arg2 = 1 gibi.
  • Varolan isteğe bağlı bir değeri ada göre değiştirerek, örneğin? arg2 = None veya? arg2 = Some (3) veya? arg2 = arg2. Bu, isteğe bağlı argümanları başka birine geçiren bir yöntem oluştururken yararlı olabilir.
  • Sırayla eşleşen normal, adsız argümanlar kullanarak. uygulanabilir olduğunu

    type A(?arg) = 
        member __.Arg : string option = arg 
    
    type B(?arg) = 
        inherit A(?arg = arg) 
    
    printfn "1. %A" (B()).Arg // None 
    printfn "2. %A" (B("1")).Arg // Some "1" 
    
    printfn "3. %A" (A()).Arg // None 
    printfn "4. %A" (A("1")).Arg // Some "1" 
    
+0

Tamam. Speklerden çok fazla şey okudun. :-) Bu neden çalışıyor? – Daniel

+0

Nevermind. Spekülasyonda buldum. Ben biraz zaman okumam lazım. – Daniel

+0

Teşekkürler ... Bazen sözdizimi sadece kolay;) – Carsten

1

Üzgünüz, önce bunu test etmek zorunda kaldı: doğru görünüyor - "?" A kendiniz için: yöntem üyelerine

type A(arg : string option) = 
    new (a) = new A(Some a) 
    new() = new A(None) 
    member __.Arg : string option = arg 

type B(?arg) = 
    inherit A(arg) 
+0

. Teşekkürler. Bekleyeceğim ve herkesin 'A' üzerindeki isteğe bağlı arkıları korurken nasıl çalışacağını önerip öneremeyeceğini göreceğim. – Daniel

+0

İkinci düşünce, bu, isteğe bağlı dağıtımların çoğaltılamayacağı anlamına gelir. Yapıcıya iletilen aynı isteğe bağlı arg'ye sahip bir yöntem veya türetilmiş bir sınıfa sahip olamazsınız - kinda sınırlama. Her seferinde doğru kurucu yüküne dallanma gerektirecektir. – Daniel

+0

bir hata olabilir - arg türünde (ile?) Dizgisi bir dize seçeneğidir, ancak yeni dizgenin tanımında - belki bir dava açmalıyız? – Carsten

İlgili konular