Skip to content

F# Guide — Type Providers: Type-Safe Data Integration

DodaTech Updated 2026-06-28 4 min read

In this tutorial, you will learn about F# Guide. We cover key concepts, practical examples, and best practices to help you master this topic.

F# type providers automatically generate types from external data sources at compile time, giving you IntelliSense and type safety when working with databases, JSON, CSV, and Web Services.

What You'll Learn

  • What type providers are
  • JSON and CSV type providers
  • SQL type providers
  • Schema-free programming
  • Custom type providers

Why It Matters

Type providers eliminate boilerplate code for data access and keep your schema in sync at compile time. Durga Antivirus Pro uses type providers for configuration files.

Real-World Use

Database access with compile-time SQL validation, REST API integration, CSV and Excel data processing.

flowchart LR
    A["Type Providers"] --> B["JSON Provider"]
    B --> C["CSV Provider"]
    C --> D["SQL Provider"]
    D --> E["Design-Time"]
    A:::current --> B
    style A fill:#2563eb,stroke:#2563eb,color:#fff
    style B fill:#dbeafe,stroke:#2563eb,color:#1e40af
    style C fill:#dbeafe,stroke:#2563eb,color:#1e40af
    style D fill:#dbeafe,stroke:#2563eb,color:#1e40af
    style E fill:#f1f5f9,stroke:#94a3b8,color:#64748b

JSON Type Provider

// Install: FSharp.Data NuGet package
open FSharp.Data

// Define type from sample JSON
type Weather = JsonProvider<"""
  { "city": "London", "temperature": 20, "unit": "C" }
""">

// Use generated types
let weather = Weather.Parse("""{"city": "Paris", "temperature": 25, "unit": "C"}""")
weather.City       // "Paris"
weather.Temperature // 25

CSV Type Provider

open FSharp.Data

// Define type from sample CSV
type Stocks = CsvProvider<"""
  Date,Open,High,Low,Close,Volume
  2024-01-01,100.0,105.0,99.0,104.0,1000000
""">

// Load actual data
let data = Stocks.Load("prices.csv")

for row in data.Rows do
    printfn "%s: %f" (string row.Date) row.Close

SQL Type Provider

open FSharp.Data.Sql

// Define database connection
type SqlDb = SqlDataProvider<
    ConnectionString = "Server=.;Database=MyDb;Trusted_Connection=true",
    DatabaseVendor = Common.DatabaseProviderTypes.MSSQLSERVER>

// Use type-safe querying
let ctx = SqlDb.GetDataContext()

let query = query {
    for user in ctx.Dbo.Users do
    where (user.Age > 21)
    select (user.Name, user.Email)
}

XML Type Provider

open FSharp.Data

// Define from sample
type Catalog = XmlProvider<"""
  <catalog>
    <book id="1"><title>F# Book</title><price>39.99</price></book>
  </catalog>
""">

// Use generated types
let catalog = Catalog.Load("books.xml")
for book in catalog.Books do
    printfn "%s: %f" book.Title book.Price

HTML Type Provider

open FSharp.Data

// Parse HTML with type-safe access
let page = HtmlDocument.Load("http://example.com")

// CSS selectors
let links = page.CssSelect("a")
for link in links do
    let href = link.AttributeValue("href")
    printfn "%s" href

World Bank Provider

open FSharp.Data

// Built-in type provider for World Bank data
type WorldBank = FSharp.Data.WorldBankProvider

let data = WorldBank.GetDataContext()
for country in data.Countries do
    let gdp = country.Indicators.``GDP (current US$)``
    printfn "%s: %A" country.Name gdp

Common Mistakes

1. Sample data mismatch

Type providers infer types from sample data. If actual data has different structure, runtime errors occur.

2. Runtime connection failures

SQL type providers require connection at design time. If the database is unavailable, IntelliSense fails.

3. Large sample files

Very large sample files slow down design-time performance. Use representative samples.

4. Forgetting NuGet packages

Type providers need their NuGet package installed (FSharp.Data, FSharp.Data.SqlClient, etc.).

5. Schema evolution

If the external schema changes, the generated types become stale. Rebuild to refresh.

Practice Questions

1. What is a type provider? A component that generates F# types from external data sources at compile time, providing type-safe access.

2. Why use type providers instead of manual classes? They stay in sync with external schemas, eliminate boilerplate, and provide compile-time validation.

3. What data sources support type providers? JSON, CSV, XML, HTML, SQL databases, REST APIs, and many more through the FSharp.Data and ecosystem libraries.

Challenge: Use the JSON type provider to create types for a public REST API and access data type-safely.

FAQ

{{< faq question="Are type providers specific to F#?" >}} Yes, type providers are an F#-specific feature. Other .NET languages do not support them. {{< /faq >}}

{{< faq question="Do type providers work at runtime?" >} The types are generated at compile time. At runtime, the generated types load data normally. No design-time dependency needed. {{< /faq >}}

{{< faq question="Can I create custom type providers?" >} Yes, but it's complex. Custom type providers are typically built by library authors for specific data sources. {{< /faq >}}

{{< faq question="Are type providers performance-neutral?" >} The generated types have minimal overhead. The type generation is a compile-time cost, not runtime. {{< /faq >}}

{{< faq question="Can I use type providers with F# interactive?" >} Yes. Type providers work in F# interactive, making them ideal for data exploration and prototyping. {{< /faq >}}

Mini Project

Use the JSON type provider to access a weather API:

open FSharp.Data

type WeatherApi = JsonProvider<"""
  {"coord":{"lon":-0.13,"lat":51.51},
   "main":{"temp":20.0,"humidity":70},
   "name":"London"}
""">

let getWeather city = async {
    let url = sprintf "https://api.openweathermap.org/data/2.5/weather?q=%s&appid=YOUR_KEY" city
    let! json = Http.AsyncRequestString(url)
    let weather = WeatherApi.Parse(json)
    return weather.Main.Temp, weather.Main.Humidity
}

// getWeather "London" |> Async.RunSynchronously

What's Next

Now that you understand type providers, explore file I/O operations.

Topic Description Link
F# File I/O File operations {{< ref "23-file-io" >}}
F# JSON JSON processing {{< ref "24-json" >}}

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro