En F#, todo lo que tiene un tipo y se puede definir se conoce como valor. Eso incluye los Boolean, los enteros y las listas, pero también las funciones. Los valores enteros se definen como uno o más dígitos (consecutivos) y admiten los operadores matemáticos predeterminados.
Asignar un valor a un nombre se conoce como enlace. Los enlaces son inmutables, lo que los hace similares a las constantes de otros lenguajes. Los enlaces se definen con la palabra clave let.
Como F# es un lenguaje de tipado estático, cada enlace tiene un tipo. Especificar el tipo de un enlace es opcional para la mayoría de los enlaces, ya que la inferencia de tipos de F# normalmente puede inferir el tipo a partir de su valor.
// Automatically inferred type
let fingers = 10
Las funciones también son enlaces normales, pero con uno o más parámetros. Una función devuelve automáticamente su última expresión. La inferencia de tipos también funciona para la mayoría de las funciones, analizando con qué valores se llama a la función y qué valor devuelve.
// Automatically inferred types for parameters and return type
let add x y = x + y
Para llamar a una función, escribes su nombre y pasas un argumento para cada uno de sus parámetros.
let five = add 2 3
Si no se puede inferir el tipo de un enlace, el compilador reportará un error. Para solucionarlo, haz explícito el tipo del enlace.
// Explicit type annotation
let fingers: int = 10
// Explicit type annotation (also for parameters)
let add (x: int) (y: int): int = x + y
Los enlaces en F# solo se pueden usar después de haber sido definidos. Usar un enlace antes de definirlo provoca un error de compilación.
// Compile error as the add binding has not yet been defined
// let seven = add 3 + 4
let add x y = x + y
El espacio en blanco significativo se usa para definir el ámbito, indentando el código con espacios en relación con la línea que declara el enlace. La convención predeterminada es usar cuatro espacios para la indentación.
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
Los enlaces de F# (que incluyen las funciones) normalmente se organizan en módulos. Un módulo agrupa funcionalidad relacionada y se define con la palabra clave module. La definición del módulo debe ir antes de sus enlaces:
module Calculator
let pi = 3.14
let add x y = x + y
F# admite dos tipos de comentarios. Los comentarios de una sola línea van precedidos por // y los comentarios multilínea se insertan entre (* y *).