2010-07-29 7 views
10

Warum funktioniert dieser Code nicht?Seq seq Typ als Mitglied Parameter in F #

type Test() = 
    static member func (a: seq<'a seq>) = 5. 

let a = [[4.]] 
Test.func(a) 

Es gibt folgende Fehlermeldung:

The type 'float list list' is not compatible with the type 'seq<seq<'a>>' 

Antwort

7

Code ändern zu

type Test() = 
    static member func (a: seq<#seq<'a>>) = 5. 

let a = [[4.]] 
Test.func(a) 

Der Trick ist in der Art von a. Sie müssen explizit zulassen, dass der äußere Seq Instanzen von Seq < 'a > und Subtypen von seq <' a > halten. Mit dem Symbol # wird dies ermöglicht.

4

Die Fehlermeldung beschreibt das Problem - in F #, list<list<'a>> ist nicht kompatibel mit seq<seq<'a>>.

Die upcast Funktion hilft dieses Problem umgehen, indem a in eine list<seq<float>> machen, die dann mit seq<seq<float>> kompatibel:

let a = [upcast [4.]] 
Test.func(a) 

Edit: Sie können in den Typen func flexibler machen sie akzeptiert. Das Original akzeptiert nur Sequenzen von seq<'a>. Auch wenn list<'a> implementiert seq<'a>, die Typen sind nicht identisch, und der Compiler gibt Ihnen einen Fehler.

Sie können jedoch func ändern Sequenzen jeglicher Art zu akzeptieren, solange diese Art seq<'a> implementiert, durch den inneren Typ wie #seq schreiben:

type Test() = 
    static member func (a: seq<#seq<'a>>) = 5. 

let a = [[4.]] 
Test.func(a) // works 
+0

Und warum ist es so? Wenn Sie schreiben "let func (a: seq <'a seq>) = 5." dann funktioniert es ohne irgendwelche Upcasting. –

+0

Ich bekomme den gleichen Fehler - http://gist.github.com/497844 –

+0

Mein Fehler. Du hast recht. Haben Sie eine Erklärung warum für 'let func (a: float seq) = 5.' wir müssen nicht upcasting machen und für seq seq müssen wir das tun? –