2016-07-30 11 views
3

Ich verwende den CsvTypeProvider, um Daten aus CSV-Dateien in meine eigenen Datenstrukturen zu mappen. Das funktioniert hervorragend, mit Ausnahme, dass ich der Abbildungsfunktion jedes Mal wiederholen:F # CsvTypeProvider - Zuordnungsfunktion aus abgeleiteten Typen

type GamesFile = CsvProvider<"./data/15.csv"> 
let games15 = GamesFile.Load("./data/15.csv").Rows |> Seq.map (fun c -> { Division = c.Div; Date = c.Date; HomeScore = c.HomeScore; AwayScore = c.AwayScore }) 
let games16 = GamesFile.Load("./data/16.csv").Rows |> Seq.map (fun c -> { Division = c.Div; Date = c.Date; HomeScore = c.HomeScore; AwayScore = c.AwayScore }) 

Wenn ich es auf eine Funktion versuchen zu bewegen, bin ich gesagt, dass „Lookup auf Objekt von unbestimmter Art, basierend auf Informationen, bevor diese Programmpunkt. Vor diesem Programmpunkt kann eine Typ-Anmerkung erforderlich sein, um den Typ des Objekts einzuschränken. Dadurch kann die Suche aufgelöst werden. "

Dies ist sinnvoll, aber wie kann ich einer Zuordnungsfunktion mitteilen, welchen Typ sie hat, wenn der Typ aus dem Inhalt der CSV abgeleitet wird? Wie wird das normalerweise gelöst?

+1

Gerade schweben auf 'c' in Ihrer IDE, wird es Ihnen die Art zeigen. Es wird auch Ihre Verwirrung darüber beseitigen, wo der Typ definiert ist. –

+1

@FyodorSoikin Um fair zu sein, ist die Tootip für Typ Provider ein bisschen verwirrend, weil es den Typ Alias ​​ignoriert. –

Antwort

5

Der Typ Provider generiert einen Typ, der die Zeile darstellt, und legt ihn als verschachtelten Typ des bereitgestellten Haupttyps offen - in Ihrem Fall als Alias ​​mit GamesFile. Diese

ist nicht ganz klar, weil die Herausgeber Tooltip mit so etwas wie
CsvFile<...>.Row, damit es nicht zeigen den Namen des Alias ​​zeigen, aber es schlägt eine verschachtelte Art ist. Um den Typ in Ihrem Code zu verwenden, können Sie einfach GamesFile.Row schreiben, so müssen Sie etwas wie folgt aus:

type GamesFile = CsvProvider<"./data/15.csv"> 

let mapRows (rows:seq<GamesFile.Row>) = 
    rows |> Seq.map (fun c -> 
    { Division = c.Div; Date = c.Date; HomeScore = c.HomeScore; AwayScore = c.AwayScore }) 

let games15 = GamesFile.Load("./data/15.csv").Rows |> mapRows 
let games16 = GamesFile.Load("./data/16.csv").Rows |> mapRows 
+1

Können Sie auch 'CsvProvider <" ./ data/15.csv ">. Zeile' statt 'GamesFile schreiben .Row'? –

+0

Ich glaube du kannst es, aber es hört sich für mich nicht nach einer guten Idee an :-) –

+0

Trotzdem würde dies die "einfach schwebend" -Lösung zumindest praktikabel machen, wenn auch nicht sehr elegant. –

Verwandte Themen