Az F#-ban mindent, aminek típusa van és definiálható, értéknek nevezünk. Ide tartoznak a Boolean-ok, az egész számok és a listák, de a függvények is. Az egész számokat egy vagy több (egymást követő) számjegy alkotja, és támogatják az alapértelmezett matematikai operátorokat.
Amikor egy értéket egy névhez rendelünk, azt kötésnek nevezzük. A kötések nem módosíthatók, ezért más nyelvek állandóihoz hasonlítanak. A kötéseket a let kulcsszóval hozzuk létre.
Mivel az F# statikusan típusos nyelv, minden kötésnek van típusa. A legtöbb kötésnél a típus megadása nem kötelező, mert az F# típuskövetkeztetése általában az érték alapján kitalálja a típust.
// Automatically inferred type
let fingers = 10
A függvények szintén hétköznapi kötések, csak egy vagy több paraméterrel. Egy függvény automatikusan visszaadja az utolsó kifejezését. A típuskövetkeztetés a legtöbb függvénynél is működik: elemzi, hogy milyen értékekkel hívjuk meg a függvényt, és hogy milyen értéket ad vissza.
// Automatically inferred types for parameters and return type
let add x y = x + y
Egy függvényt úgy hívunk meg, hogy leírjuk a nevét, majd minden paraméteréhez átadunk egy-egy argumentumot.
let five = add 2 3
Ha egy kötés típusa nem következtethető ki, a fordító hibát jelez. Ezt úgy javíthatod, hogy megadod a kötés típusát.
// Explicit type annotation
let fingers: int = 10
// Explicit type annotation (also for parameters)
let add (x: int) (y: int): int = x + y
Az F#-ban a kötéseket csak azután használhatod, miután létrehoztad őket. Ha egy kötést a létrehozása előtt használsz, az fordítási hibát okoz.
// Compile error as the add binding has not yet been defined
// let seven = add 3 + 4
let add x y = x + y
A scope kijelölése a jelentős whitespace-szel történik: a kódot a kötést deklaráló sorhoz képest szóközökkel húzod be. Az alapértelmezett konvenció szerint négy szóközzel húzunk be.
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
Az F# kötéseit (köztük a függvényeket) általában modulokba szervezzük. Egy modul az egymáshoz tartozó funkcionalitást csoportosítja, és a module kulcsszóval hozzuk létre. A modul definíciójának meg kell előznie a kötéseit:
module Calculator
let pi = 3.14
let add x y = x + y
Az F# kétféle megjegyzést támogat. Az egysoros megjegyzéseket // előzi meg, a többsorosakat pedig (* és *) közé írjuk.