¿Qué son?

Muy resumidamente, los Type Providers (TP) son componentes que exponen metadatos al compilador de F# de forma que sean visibles como tipos, métodos y propiedades de .NET. En el fondo es un proceso de Generación Automática de Código (GAC) pero con algunas diferencias de como se ha venido haciendo tradicionalmente:
  • El TP es invocado implícitamente durante la compilación. A diferencia de la GAC tradicional que generalmente el código es generado explícitamente antes de ser usado. 
  • Los TP están integrados en el lenguaje. A nivel práctico esto significa que los ensamblados que contengan referencias a TPs pueden ser referenciados desde otros ensamblados y, como he citado anteriormente, ser usados como tipos normales de .NET.
  • La generación de código en los TP es perezosa (lazy) o lo que es lo mismo, sólo genera el código que se usará. Esto es importante porque reduce dramáticamente el tamaño del código a ser generado. 
  • Como consecuencia directa de que el código es generado en tiempo de compilación, siempre estará sincronizado con el resto del código. Este es sin duda uno de los grandes problemas de la GAC tradicional. 
En síntesis, un TP nos ayudará como desarrolladores eliminando la necesidad de escribir código boilerplate haciendo un wrapper por nosotros de la fuente de datos a la que queremos acceder.
Desafortunadamente los TP sólo pueden ser creados de F#. Dado que C# suele ir algo por detrás, quizá en futuras versiones sea posible crearlos desde C# también pero a no ser que hayan cambios en el roadmap, no será en C# 6. La buena noticia, es que puesto que genera tipos de .net ¡pueden ser consumidos de C#!

Generative Type Providers vs Erasing Type Provider

La realidad es que no es del todo correcto que puedan ser consumidos desde C#, lo cierto es que los GTPs sí generan tipos de .NET no siendo el caso para los ETPs. A diferencia de los GTP los ETP en lugar de generar tipos, generan fakes de los tipos, que le dicen al compilador de F#, por ejemplo, que miembros deben de ser llamados. Pero cuando el compilador los compila, los “fakes” son reemplazados por otro código. Y es por esto, que los ETP no pueden ser consumidos desde CSharp, porque los tipos que utilizarías desde C# ¡serían los fakes!

Usando un Type Provider para consumir la API de GitHub.

En la actualidad hay un considerable número de TP y de la más diversa índole. Desde los más básicos que pueden consumir CSV, XML o JSON hasta TP que pueden interactuar con lenguajes como R o en Python (en fase de desarrollo) pasando por TP para consumir datos estáticos de bases de datos. Para no extenderme demasiado, no será hasta la próxima entrada que no veamos cómo hacer un TP (y generativo para que pueda ser consumido desde C#). Pero para tampoco irnos con las manos vacías, veamos como utilizar un TP, en concreto el de JSON,  para acceder a una API REST cualquiera, por ejemplo ésta de GitHub: https://api.github.com/repos/fsharp/fsharp
Para usar el JSON TP bastaría con instalar el paquete de NuGet FSharp.Data y abrirlo.
type ApiGit = JsonProvider<«https://api.github.com/repos/fsharp/fsharp«>  
let user = «fsharp«
let repoName = «fsharp«
let repo =  ApiGit.Load(«https://api.github.com/repos/«+user+«/«+repoName)  

En la primera línea definimos el tipo, es necesario que le pasemos un sample de la estructura de los datos para que la pueda inferir. El sample puede ser: un fragmento de JSON directamente como cadena, el path de un fichero que contenga la estructura (en mi opinión la mejor opción) o lo que hemos hecho ahora: una dirección web que contenga la estructura. Es importante matizar que debemos pasar un literal constante, no podemos especificar variables en la dirección a la estructura del fichero. 
En la última línea, evidentemente podremos parametrizar la url que contendrá los datos ( además de Load, tenemos AsyncLoad que nos permite procesar los datos asíncronamente). 
Podremos ver el TP en acción con visualizar los miembros de repo a través del Intellisense.
 
¡El TP acaba de generar por nosotros todos los miembros que expone la API y su tipo! Pero lo más fascinante es que esto es sólo un ejemplo y se puede aplicar a muchos más tipos de datos e incluso, como veremos, podremos crear nuestros propios TP. 
Por cierto, hace un par de meses @acasquete y yo estuvimos en un webcast introduciendo F# si te lo perdiste o quieres repasar algunos conceptos, aquí tienes el video: http://vimeo.com/88283954