Dat snelle actie-correctie programmeren is dus exploratief programmeren, en dat kan ook in F#, via de F# Interactive. In Visual Studio vind je die via View / Other Windows / F# Interactive, of de sneltoets Ctrl + Alt + F. De beste manier om ermee te werken is, door een nieuw F# project te starten via File / New Project en dan een Visual F# project template te kiezen, bijvoorbeeld een Console Applicatie. Eenmaal het project aangemaakt, voeg je via het project een “New Item” toe en kies je voor een “Script file (F#)”. In deze script file kun je experimenteren. Deze scripts worden ook niet mee-gecompileerd als je een applicatie wilt bouwen.
In zo’n script file kun je naar hartenlust experimenteren. Je kunt dan een paar regels selecteren, en als je daarna op Alt + Enter drukt, wordt het uitgevoerd in de F# Interactive.
Een omgeving als dit is ideaal voor de data-analist, die graag F# wil gebruiken als aanvullende tool in zijn gereedschapskist. Je kunt bijvoorbeeld heel makkelijk een verbinding maken met een database, waarbij je direct toegang krijgt tot de data, strong typed en met intellisense.
Je kunt bijvoorbeeld de Northwind data ophalen, via een OData type provider:
#r @"System.Data.Services.Client"
open System
open Microsoft.FSharp.Data.TypeProviders
open System.Data.Services.Client
type Northwind = ODataService<"http://services.odata.org/Northwind/Northwind.svc/">
let db = Northwind.GetDataContext()
let categorien = query {
for row in db.Categories do
select row
}
Stel je wilt weten wat de totale verkochte waarde is, per werknemer in de database, dan kunnen we daar een ingewikkelde query voor bedenken. Helaas ondersteunt OData (v2.0) geen joins in queries, dus we moeten zelf iets doen om deze informatie boven tafel te krijgen.
Laten we eerst eens kijken naar de employees in de database:
for row in db.Employees do
select row
}
employees |> Seq.iter(fun e -> printfn "%d %s %s" e.EmployeeID e.FirstName e.LastName)
Vervolgens kiezen we een van de employees om verder mee te werken, de eerste, omdat dit het makkelijkste gaat:
for order in db.Orders do
where (order.EmployeeID.Value = empId)
select order
}
let empOrders = getOrders testEmp.EmployeeID
empOrders |> Seq.length
De orders bevatten zelf geen bedragen, daarvoor moeten we dieper kijken in de order details. Net als hierboven, gebruiken we de eerste order uit de reeks om mee te testen.
let getOrderDetail ordId = query {
for orderDetail in db.Order_Details do
where (orderDetail.OrderID = ordId)
select orderDetail
}
let orderVanEmployee = getOrderDetail testOrder.OrderID
De som van onze testorder wordt als volgt berekend: