In F#, tutto ciò che ha un tipo e può essere definito è noto come valore. Questo include i valori booleani, gli interi e le liste, ma anche le funzioni. I valori interi sono definiti come una o più cifre (consecutive) e supportano i operatori matematici predefiniti.
Assegnare un valore a un nome si chiama associazione. Le associazioni sono immutabili, il che le rende simili alle costanti di altri linguaggi. Le associazioni si definiscono con la parola chiave let.
Poiché F# è un linguaggio a tipizzazione statica, ogni associazione ha un tipo. Specificare il tipo di un'associazione è facoltativo per la maggior parte delle associazioni, perché l'inferenza di tipo di F# riesce di solito a dedurlo in base al valore.
// Automatically inferred type
let fingers = 10
Anche le funzioni sono normali associazioni, ma con uno o più parametri. Una funzione restituisce automaticamente la sua ultima espressione. L'inferenza di tipo funziona anche per la maggior parte delle funzioni: analizza con quali valori la funzione viene chiamata e quale valore restituisce.
// Automatically inferred types for parameters and return type
let add x y = x + y
Per chiamare una funzione, scrivi il suo nome e passa un argomento per ognuno dei parametri della funzione.
let five = add 2 3
Se il tipo di un'associazione non può essere dedotto, il compilatore segnalerà un errore. Per risolvere, specifica esplicitamente il tipo dell'associazione.
// Explicit type annotation
let fingers: int = 10
// Explicit type annotation (also for parameters)
let add (x: int) (y: int): int = x + y
In F#, le associazioni si possono usare solo dopo essere state definite. Usare un'associazione prima di definirla produce un errore di compilazione.
// Compile error as the add binding has not yet been defined
// let seven = add 3 + 4
let add x y = x + y
Gli spazi bianchi sono significativi: servono a definire lo scope, indentando il codice con spazi rispetto alla riga che definisce l'associazione. Per convenzione, si usano quattro spazi per l'indentazione.
let toes =
let left = 5
let right = 5
left + right
let multiplyPlusTwo x y =
let product = x * y
product + 2
// Trying to access the left, right or product bindings
// here would result in a compile error
Le associazioni di F# (comprese le funzioni) sono di solito organizzate in moduli. Un modulo raggruppa funzionalità correlate e si definisce con la parola chiave module. La definizione del modulo deve precedere le sue associazioni:
module Calculator
let pi = 3.14
let add x y = x + y
F# supporta due tipi di commenti. I commenti su una sola riga sono preceduti da //, mentre i commenti multilinea si inseriscono tra (* e *).