In F# wird alles, was einen Typ hat und definiert werden kann, als Wert bezeichnet. Das umfasst boolesche Werte, Ganzzahlen und Listen, aber auch Funktionen. Ganzzahlwerte werden als eine oder mehrere (aufeinanderfolgende) Ziffern definiert und unterstützen die üblichen mathematischen Operatoren.
Wenn du einem Namen einen Wert zuweist, nennt man das eine Bindung. Bindungen sind unveränderlich, was sie Konstanten in anderen Sprachen ähnlich macht. Bindungen definierst du mit dem Schlüsselwort let.
Da F# eine statisch typisierte Sprache ist, hat jede Bindung einen Typ. Bei den meisten Bindungen ist es optional, den Typ anzugeben, denn die Typinferenz von F# kann den Typ meist anhand des Werts ableiten.
// Automatically inferred type
let fingers = 10
Funktionen sind ebenfalls normale Bindungen, allerdings mit einem oder mehreren Parametern. Eine Funktion gibt automatisch ihren letzten Ausdruck zurück. Die Typinferenz funktioniert auch bei den meisten Funktionen, indem sie analysiert, mit welchen Werten die Funktion aufgerufen wird und welchen Wert die Funktion zurückgibt.
// Automatically inferred types for parameters and return type
let add x y = x + y
Eine Funktion rufst du auf, indem du ihren Namen nennst und für jeden Parameter der Funktion ein Argument übergibst.
let five = add 2 3
Kann der Typ einer Bindung nicht abgeleitet werden, meldet der Compiler einen Fehler. Um das zu beheben, gibst du den Typ der Bindung explizit an.
// Explicit type annotation
let fingers: int = 10
// Explicit type annotation (also for parameters)
let add (x: int) (y: int): int = x + y
Bindungen in F# kannst du erst verwenden, nachdem sie definiert wurden. Wenn du eine Bindung verwendest, bevor sie definiert wurde, gibt es einen Kompilierfehler.
// Compile error as the add binding has not yet been defined
// let seven = add 3 + 4
let add x y = x + y
Signifikante Leerzeichen definieren den Gültigkeitsbereich, indem du den Code relativ zur Zeile, die die Bindung deklariert, mit Leerzeichen einrückst. Standardmäßig werden vier Leerzeichen zum Einrücken verwendet.
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
F#-Bindungen (zu denen auch Funktionen gehören) sind meist in Modulen organisiert. Ein Modul gruppiert zusammengehörige Funktionalität und wird mit dem Schlüsselwort module definiert. Die Moduldefinition muss vor ihren Bindungen stehen:
module Calculator
let pi = 3.14
let add x y = x + y
F# unterstützt zwei Arten von Kommentaren. Einzeilige Kommentare beginnen mit //, mehrzeilige Kommentare stehen zwischen (* und *).