Em F#, tudo o que tem um tipo e pode ser definido é conhecido como um valor. Isso inclui Boolean, inteiros e listas, mas também funções. Os valores inteiros definem-se como um ou mais algarismos (consecutivos) e suportam os operadores matemáticos predefinidos.
Atribuir um valor a um nome designa-se por associação. As associações são imutáveis, o que as torna semelhantes a constantes de outras linguagens. As associações definem-se com a palavra-chave let.
Como o F# é uma linguagem de tipos estáticos, cada associação tem um tipo. Indicar o tipo de uma associação é opcional para a maioria delas, pois a inferência de tipos do F# consegue normalmente inferir o tipo a partir do valor.
// Automatically inferred type
let fingers = 10
As funções também são associações normais, mas com um ou mais parâmetros. Uma função devolve automaticamente a sua última expressão. A inferência de tipos também funciona para a maioria das funções, analisando com que valores a função é chamada e que valor devolve.
// Automatically inferred types for parameters and return type
let add x y = x + y
Invoca-se uma função indicando o seu nome e passando argumentos para cada um dos parâmetros da função.
let five = add 2 3
Se não for possível inferir o tipo de uma associação, o compilador reporta um erro. Para resolver isso, torna o tipo da associação explícito.
// Explicit type annotation
let fingers: int = 10
// Explicit type annotation (also for parameters)
let add (x: int) (y: int): int = x + y
Em F#, as associações só podem ser usadas depois de serem definidas. Usar uma associação antes de ela ser definida dá origem a um erro de compilação.
// Compile error as the add binding has not yet been defined
// let seven = add 3 + 4
let add x y = x + y
Os espaços em branco são significativos: servem para definir o âmbito, indentando o código com espaços relativamente à linha que declara a associação. A convenção predefinida é usar quatro espaços para a indentação.
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
As associações em F# (que incluem as funções) organizam-se habitualmente em módulos. Um módulo agrupa funcionalidade relacionada e define-se com a palavra-chave module. A definição do módulo tem de preceder as suas associações:
module Calculator
let pi = 3.14
let add x y = x + y
O F# suporta dois tipos de comentários. Os comentários de uma linha são precedidos de // e os comentários de várias linhas são inseridos entre (* e *).