F#에서 타입을 가지면서 정의할 수 있는 모든 것은 _값_이라고 해요. 여기에는 불리언, 정수, 배열뿐만 아니라 함수도 포함돼요. 정수 값은 하나 이상의 (연속된) 숫자로 정의하고, 기본 수학 연산자를 지원해요.
값에 이름을 할당하는 것을 _바인딩_이라고 해요. 바인딩은 불변이어서 다른 언어의 상수와 비슷해요. 바인딩은 let 키워드로 정의해요.
F#은 정적 타입 언어라서 각 바인딩에는 타입이 있어요. 대부분의 바인딩에서는 타입을 명시하는 것이 선택 사항이에요. F#의 _타입 추론_이 보통 값에 따라 타입을 추론할 수 있기 때문이죠.
// Automatically inferred type
let fingers = 10
함수도 일반적인 바인딩이지만, 하나 이상의 매개변수를 가져요. 함수는 마지막 표현식을 자동으로 반환해요. 타입 추론은 대부분의 함수에서도 동작하는데, 함수가 어떤 값으로 호출되고 어떤 값을 반환하는지 분석하기 때문이에요.
// Automatically inferred types for parameters and return type
let add x y = x + y
함수를 호출할 때는 함수 이름을 쓰고, 각 매개변수에 대응하는 인자를 전달해요.
let five = add 2 3
바인딩의 타입을 추론할 수 없으면 컴파일러가 오류를 보고해요. 이럴 때는 바인딩의 타입을 명시적으로 지정하면 돼요.
// Explicit type annotation
let fingers: int = 10
// Explicit type annotation (also for parameters)
let add (x: int) (y: int): int = x + y
F#의 바인딩은 정의한 뒤에만 사용할 수 있어요. 바인딩을 정의하기 전에 사용하면 컴파일 오류가 발생해요.
// Compile error as the add binding has not yet been defined
// let seven = add 3 + 4
let add x y = x + y
F#에서는 공백의 의미가 중요해요. 바인딩을 선언한 줄을 기준으로 코드를 스페이스로 들여쓰기해서 스코프를 정의해요. 기본 관례는 스페이스 네 칸으로 들여쓰기하는 거예요.
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#의 바인딩(함수 포함)은 보통 모듈로 구성해요. 모듈은 관련 있는 기능을 묶으며, module 키워드로 정의해요. 모듈 정의는 그 안의 바인딩보다 먼저 와야 해요:
module Calculator
let pi = 3.14
let add x y = x + y
F#은 두 가지 종류의 주석을 지원해요. 한 줄 주석은 //로 시작하고, 여러 줄 주석은 (*와 *) 사이에 넣어요.