Connecting to an SQL database or retrieving data from a web service might seem like a mundane thing to do in a programming language, but the mechanism F# uses for connecting to data providers sets it apart from other languages by the use of a feature called type providers. But before we can look at the power and flexibility type providers bring to the F# language, let’s look at why they are needed.
F# is a statically typed programming language and goes well out of its way to encourage F# programmers to embrace types. For example, not many other languages have features like:
Type abbreviations such as
NodeList = List<Node> allowing you to create ad hoc
Units of measure such as
32.0f<Fahrenheit> that allow you to
further specialize primitive data types.
But F#’s type system has a crucial limitation. (Actually, this is true for most any programming language.) Types only describe the shape of data within programs. The outside world—and the data it contains—is also typed, but in a way that is completely divorced from the program code.
The API for opening XML documents just returns a generic
XElement back, even if the underlying document
contains data with a well-known structure or schema.
The API for reading a web request's response just returns a byte buffer, which could represent JSON, an XML SOAP message, or a custom binary format such as a Protocol Buffer.
If protobufs and JSON are familiar to you, then you should immediately ...