Type Providers

Type providers generate types from external schemas at compile time, so data access is typed and IntelliSense-friendly. Examples: FSharp.Data (JSON/CSV/XML/HTML), SQLProvider, FSharp.Data.SqlClient, SwaggerProvider (OpenAPI), FSharp.Configuration (YAML/INI), and the R type provider.

#r "nuget: FSharp.Data"
open FSharp.Data

// JSON type provider: types inferred from a sample (at compile time)
type Weather = JsonProvider<"""{ "city": "Pune", "temp": 21.5, "tags": ["sunny"] }""">
let w = Weather.Parse("""{ "city": "Mumbai", "temp": 30.1, "tags": ["humid", "hot"] }""")
w.City, w.Temp, w.Tags                     // "Mumbai", 30.1M, [|"humid"; "hot"|] (typed!)

// From a URL or file sample
type GitHubRepo = JsonProvider<"https://api.github.com/repos/dotnet/fsharp">   // illustrative (needs network at compile time)

// CSV type provider
type Sales = CsvProvider<"Date,Region,Amount\n2025-01-01,North,100.5">
let sales = Sales.Load("sales.csv")
for row in sales.Rows do printfn "%s %M" row.Region row.Amount

// XML and HTML type providers
type Feed = XmlProvider<"""<rss><channel><title>T</title><item><title>A</title></item></channel></rss>""">
type Wiki = HtmlProvider<"https://en.wikipedia.org/wiki/F_Sharp_(programming_language)">   // illustrative

// SQL type providers: SQLProvider, FSharp.Data.SqlClient (compile-time checked SQL)
// [<Literal>] let ConnStr = "Server=...;Database=...;"
// type GetUsers = SqlCommandProvider<"SELECT Id, Name FROM Users WHERE Age > @age"
…