2013-02-21 17 views
6

F # Interactive (fsi) içinde, etkileşimli oturumda bir tür için güzel yazdırma sağlamak için AddPrinter veya AddPrinterTransformer kullanabilirsiniz. Genel bir tür için böyle bir yazıcıyı nasıl ekleyebilirim? türü için joker _ kullanma çalışmaz:Genel bir tür için güzel bir yazıcıyı nasıl fsi'ye eklerim?

> fsi.AddPrinter(fun (A : MyList<_>) -> A.ToString());; 

yazıcı sadece kullanılmaz. Ya, ne istiyorum değil

> fsi.AddPrinter(fun (A : MyList<'T>) -> A.ToString());; 

    fsi.AddPrinter(fun (A : MyList<'T>) -> A.ToString());; 
    -------------------------------^^ 

d:\projects\stdin(70,51): warning FS0064: This construct causes code 
to be less generic than indicated by the type annotations. The type 
variable 'T been constrained to be type 'obj'. 

: bir tür parametresinde koyarak

bir uyarı da verir.

+2

Bunun mümkün olmadığından eminim. Bir tür arg, somut bir tip gerektirir. – Daniel

+0

'MyList <'T>' için 'ToString' öğesini geçersiz kılabilirsiniz? – Daniel

cevap

7

Bu genel durum için işe yaramaz, ancak göründüğünden bu yana kendi türünüzle çalışıyor (örneğiniz örneğinde) ve ToString'u etkilemek istemediğinizi varsayarak Bu:

type ITransformable = 
    abstract member BoxedValue : obj 

type MyList<'T>(values: seq<'T>) = 
    interface ITransformable with 
    member x.BoxedValue = box values 

fsi.AddPrintTransformer(fun (x:obj) -> 
    match x with 
    | :? ITransformable as t -> t.BoxedValue 
    | _ -> null) 

Çıktı:

> MyList([1;2;3]) 
val it : MyList<int> = [1; 2; 3] 

bir üçüncü taraf jenerik sen AddPrintTransformer kullanabilirsiniz tipi ve yansıma için değer görüntülenecek alır. Kaynağa sahipseniz bir arayüz daha kolaydır.

+0

Teşekkürler. Ama neden 'obj' türüne 'AddPrintTransformer' parametresini bildiriyorsunuz? Neden doğrudan orada 'ITransformable' kullanılmıyor? Veya 'AddPrinter'' 'dönüştürülebilir 'alan bir işlevle kullanın? –

+0

Bu 'obj' çünkü yansımayı kullanma yoluna ilk gittim. Muhtemelen bunu 'dönüştürülebilir' olarak değiştirebilirsiniz. Bence, 'AddPrintTransformer', yapmaya çalıştığınız şey için daha iyidir, çünkü çoğu durumda, görüntülenebilir bir değere delege etmek yeterlidir. – Daniel

İlgili konular