2014-04-15 13 views
11

Was bedeutet # in Typensignaturen wie seq<#seq<'a>> im Vergleich zu nur seq<seq<'a>>?Was bedeutet # (Pfundzeichen) in Typ-Signaturen?

+4

Siehe: http:

let f1 (s:seq<seq<'T>>) = [ for i in s -> Seq.length i ] let f2 (s:seq<#seq<'T>>) = [ for i in s -> Seq.length i ] 

Aber nur die zweite kann auf Listen von Listen aufgerufen werden // msdn.microsoft.com/en-us/library/dd233228.aspx und speziell http://msdn.microsoft.com/en-us/library/dd233198.aspx. – rightfold

Antwort

19

Dies wird flexible Typ genannt. Die kurze Zusammenfassung ist, dass #type bedeutet jeder Typ, der von type vererbt wird. In Ihrem konkreten Beispiel wird seq<#seq<'a>> eine Sequenz von beliebigen Sammlungen sein, die 'a Werte enthalten.

Beim Aufruf einer Funktion werden mit F # betonierte Typen automatisch an Schnittstellen übergeben. Sie können also beispielsweise eine Funktion aufrufen, die seq<'a> mit dem Array 'a[] als Argument verwendet. Dies funktioniert jedoch nicht, wenn Sie ein Array von Arrays haben - weil 'a[][] nur seq<'a[]>, aber nicht seq<seq<'a>> implementiert.

Zum Beispiel die folgenden beiden Funktionen geben Liste der Längen von verschachtelten Sequenzen:

[ [1]; [2;3] ] |> f1 
// error FS0001: The type 'int list list' is not 
// compatible with the type 'seq<seq<'a>>' 

[ [1]; [2;3] ] |> f2 
// val it : int list = [1; 2]