2011-01-17 14 views

risposta

37

Supponiamo di avere qualche entità di dati arbitraria nel mondo. Per questo esempio, diciamo che è un foglio di calcolo.

Supponiamo anche che tu abbia un modo per ottenere/inferire schema/metadati per quei dati - cioè, puoi conoscere i tipi (es. Doppio contro stringa) e le relazioni (es. Questa colonna significa 'salario') e metadati (es. questo foglio è per il budget di giugno 2009).

fornitori di tipo consente di codificare una sorta di 'biblioteca shim' che sa di qualche tipo di entità di dati (ad esempio, un foglio di calcolo), e l'uso che biblioteca come parte della toolchain compilatore/IDE in modo che è possibile scrivere codice come

mySpreadsheet.ByRowAndColumn.C4 

o qualcosa del genere, e ottenere Intellisense (completamento automatico) e le descrizioni dei comandi (ad esempio descrivono cella C4 come stipendio per Bob) e tipizzazione statica (ad esempio, hanno si tratti di una doppia o una stringa o qualunque cosa sia). In sostanza, questo ti offre le possibilità di realizzare utensili di modelli di oggetti con staticamente tipizzati grazie alla leva di facile utilizzo di vari sistemi dinamici o di generazione di codice, con alcuni miglioramenti su entrambi. Il "costo" è che qualcuno deve scrivere la libreria shim (il 'type provider'), ma molti di questi provider sono molto generali (ad esempio uno che parla OData o Excel o WMI o whatnot) e quindi una piccola manciata di librerie di provider di tipi rende disponibili enormi quantità di dati del mondo nel tuo linguaggio di programmazione con la tipizzazione statica e il supporto di strumenti di prima classe.

L'architettura è un compilatore aperto, in cui gli autori di provider implementano una piccola interfaccia che consente loro di immettere nuovi nomi/tipi nel contesto di programmazione. Un provider di tipi potrebbe essere solo un'altra libreria che si passa al compilatore (un riferimento nel progetto, -r -ed), con metadati aggiuntivi che lo contrassegnano come un provider di tipi che partecipa alle sezioni compilazione/IDE/codegen di sviluppo.

Non so esattamente cosa sia un "mappatore personalizzato" nel tuo esempio xml per tracciare un confronto.

+0

qualsiasi possibilità di avere informazioni su quando i provider di tipi diventeranno disponibili? Grazie – jlezard

+0

No, scusa, nessuna informazione ancora. – Brian

+0

Per mappatore personalizzato intendevo una libreria che mappa un file xml in un modello di oggetto fortemente tipizzato. Non riesco a vedere la grande differenza tra una tale libreria e una libreria di provider di tipi – terjetyl

8

Capisco che questa è una vecchia domanda, ma ora i provider di tipi sono disponibili (dato che F # 3.0 è stato rilasciato). C'è anche un white paper che lo spiega. E abbiamo un drop di codice da Microsoft che può farti vedere sotto il cofano.

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

5

fornitori di tipo usano citazioni s 'F # di agire come (di fatto) plugin compilatore in grado di generare codice basato su meta-dati in fase di compilazione.

Questo consente (per esempio) di leggere in alcuni JSON, o uno schema di base dati, o qualche XSD o qualsiasi altra cosa e quindi generare classi F # per modellare il dominio rappresentato dai metadati.

In termini di creazione, ho scritto alcuni post di blog che potrebbero essere di interesse a partire da Type Providers from the Ground Up.

+0

I provider di tipi non hanno realmente nulla a che fare con un emettitore IL (i provider di tipo generativo possono usarne uno come dettaglio di implementazione, ma i provider di cancellazione non gestiscono affatto IL). – kvb

+0

Per quanto posso vedere da ProvidedTypes.fs, anche nei provider di cancellazione il codice di chiamata fornito per metodi e proprietà come preventivi viene trasformato in IL come viene aggiunto all'assembly. I tipi non sono, ovviamente. – mavnn

+0

Al momento non ho il tempo di esaminarlo ulteriormente, ma ciò mi sorprenderebbe: l'API raw è progettata intorno alle citazioni e il compilatore utilizza pattern come '(| ProvidedCallExpr | _ |)' definito in [est. fs] (https://github.com/fsharp/fsharp/blob/master/src/fsharp/est.fs) che accettano le citazioni dal provider e li avvolgono e che vengono poi convertiti in nodi AST appropriati in 'convertProvidedExpressionToExprAndWitness' in [typreIns.fs] (https://github.com/fsharp/fsharp/blob/master/src/fsharp/typrelns.fs). – kvb

Problemi correlati