2011-01-17 7 views
38

ich nicht ganz Typ-Anbieter, nachdem gerade Don Symes des pdc Video http://player.microsoftpdc.com/Session/04092962-4ed1-42c6-be07-203d42115274F # Typ-Provider, wie sie funktionieren

Verstehe ich das richtig bekommen. Sie können fertig Typ Provider für Twitter, Excel ...

Was, wenn ich eine benutzerdefinierte Xml-Struktur habe, muss ich meinen eigenen Typ Provider dafür implementieren und wie unterscheidet sich das Erstellen meiner eigenen benutzerdefinierten Mapper?

Antwort

37

Angenommen, Sie haben eine beliebige Dateneinheit in der Welt. In diesem Beispiel nehmen wir an, es handelt sich um eine Kalkulationstabelle.

Lassen Sie uns auch sagen, Sie haben eine Möglichkeit, Schema/Metadaten für diese Daten zu erhalten/abzuleiten - das heißt, Sie können Typen (zB Double versus String) und Beziehungen (zB diese Spalte bedeutet "Gehalt") und Metadaten (zB Dieses Blatt gilt für den Haushaltsplan für Juni 2009).

Mit dem Typ Provider können Sie eine Art 'Shim-Bibliothek' programmieren, die eine Art Dateneinheit kennt (zB eine Tabellenkalkulation) und diese Bibliothek als Teil der Compiler/IDE-Toolchain verwenden, um Code wie

zu schreiben
mySpreadsheet.ByRowAndColumn.C4 

oder etwas, und erhalten Intellisense (Autovervollständigung) und Tooltips (zB die Beschreibung der Zelle C4 als Gehalt für Bob) und statische Typisierung (zB haben sie eine doppelte oder eine Schnur oder was auch immer es ist). Im Wesentlichen bietet dies Ihnen die Tooling-Möglichkeiten von statisch typisierten Objektmodellen mit der Benutzerfreundlichkeit von verschiedenen dynamischen oder Code-generierenden Systemen, mit einigen Verbesserungen bei beiden. Die "Kosten" sind, dass jemand die Shim-Bibliothek schreiben muss (der "Typ-Provider"), aber viele solcher Anbieter sind sehr allgemein (z. B. einer, der OData oder Excel oder WMI oder Ähnliches spricht) und so eine kleine Handvoll Typ-Provider-Bibliotheken macht große Mengen der Weltdaten in Ihrer Programmiersprache mit statischer Typisierung und erstklassiger Werkzeugunterstützung verfügbar.

Die Architektur ist ein offener Compiler, bei dem Provider-Autoren eine kleine Schnittstelle implementieren, die es ihnen ermöglicht, neue Namen/Typen in den Programmierkontext einzufügen. Ein Typ-Provider ist möglicherweise nur eine weitere Bibliothek, die Sie an den Compiler übergeben (eine Referenz in Ihrem Projekt, -r -ed), mit zusätzlichen Metadaten, die ihn als Typ-Provider kennzeichnen, der an den Kompilierungs-/IDE-/Codegen-Teilen der Entwicklung teilnimmt.

Ich weiß nicht genau, was ein "benutzerdefinierter Mapper" in Ihrem XML-Beispiel ist, um einen Vergleich zu zeichnen.

+0

Haben Sie eine Chance, dass Sie wissen, wann Type Provider verfügbar werden? Danke – jlezard

+0

Nein, tut mir leid, noch keine Informationen. – Brian

+0

Mit benutzerdefinierten Mapper meinte ich eine Bibliothek, die eine XML-Datei in ein stark typisiertes Objektmodell abbildet. Ich kann den großen Unterschied zwischen einer solchen Bibliothek und einer Typ-Provider-Bibliothek nicht sehen. – terjetyl

8

Ich verstehe, dass dies eine alte Frage ist, aber jetzt Typ-Provider zur Verfügung stehen (wie F # 3.0 wurde veröffentlicht). Es gibt ein weißes Papier, das es auch erklärt. Und wir haben einen Code-Drop von Microsoft, der Sie unter die Haube schauen lässt.

http://www.infoq.com/news/2012/09/fsharp-type-providers

5

Typ-Anbieter verwendet F # 's Zitate als (effektiv) Compiler Plugins zu handeln, den Code auf Basis von Meta-Daten zum Zeitpunkt der Kompilierung erzeugen kann.

Dadurch können Sie (zum Beispiel) ein JSON oder ein Datenbankschema oder eine XSD oder ähnliches einlesen und dann F # -Klassen generieren, um die Domäne zu modellieren, die Metadaten darstellen.

In Bezug auf die Erstellung von ihnen, schrieb ich ein paar Blog-Beiträge, die von interessieren könnten.

+0

Typ-Provider haben mit einem IL-Emitter eigentlich nichts zu tun (generative Provider können einen als Implementierungsdetail verwenden, aber Lösch-Provider behandeln IL überhaupt nicht). – kvb

+0

Soweit ich von "AcreditedTypes.fs" sehen kann, wird der Aufrufcode, den Sie für Methoden und Eigenschaften als Zitate angeben, selbst beim Löschen von Anbietern in IL umgewandelt, wenn er der Assembly hinzugefügt wird. Die Typen selbst sind natürlich nicht. – mavnn

+0

Ich habe im Moment keine Zeit, es genauer zu betrachten, aber das würde mich überraschen - die rohe API ist um Zitate herum entworfen, und der Compiler verwendet Muster wie '(| PreviousCallExpr | _ |)' definiert in [est. fs] (https://github.com/fsharp/fsharp/blob/master/src/fsharp/est.fs), die Zitate vom Provider nehmen und sie umhüllen, und die dann in 'convertProvidedExpressionToExprAndWitness' in richtige AST-Knoten umgewandelt werden in [typreIns.fs] (https://github.com/fsharp/fsharp/blob/master/src/fsharp/typprelns.fs). – kvb