F#의 array는 길이가 고정된, 0개 이상의 값으로 이루어진 컬렉션이에요. 즉, 배열을 한 번 만들면 크기는 바뀌지 않지만 값은 바꿀 수 있어요. 배열에 들어 있는 값은 모두 같은 타입이어야 해요. 배열은 다음과 같이 정의할 수 있어요:
let empty = [| |]
let emptyAlternative = Array.empty
let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5
let threeValues = [| "a"; "b"; "c" |]
원소는 인덱스를 사용해 배열에 대입하거나 배열에서 가져올 수 있어요. F# 배열의 인덱스는 0부터 시작해요. 즉, 첫 번째 원소의 인덱스는 항상 0이에요:
let numbers = [| 2; 3; 5 |]
// Update value in array
numbers[2] <- 9
// Read value from array
numbers[2]
// => 9
배열은 Array 모듈에 정의된 함수와 연산자로 다뤄요. 이런 함수 중 일부는 array 인스턴스의 속성으로도 사용할 수 있어요:
Array.length [| 7; 8 |] // => 2
[| 7; 8 |].Length // => 2
여기에 정답이나 오답은 없어요. 일반적으로 Array 모듈의 함수는 타입 추론과 더 잘 어울리고, 속성은 코드를 더 간결하게 만들어 줘요.
배열 패턴을 사용하면 배열에 패턴 매칭을 할 수 있어요:
let describe array =
match array with
| [| |] -> "Empty"
| [| 1; 2; three |] -> sprintf "1, 2, %d" three
| _ -> "Other"
describe [| |] // => "Empty"
describe [| 1; 2; 4 |] // => "1, 2, 4"
describe [| 5; 7; 9 |] // => "Other"
패턴 매칭을 할 때 값을 버릴 수도 있어요. 특정 경우에 값이 필요하지 않을 때(즉, 값을 사용하지 않을 때)는 밑줄('_')을 사용해 그 뜻을 나타내요:
let describe array =
match array with
| [| |] -> "Empty array"
| [| x |] -> "Array with one item"
| [| _; y |] -> "Array with two items (first item ignored)"
| _ -> "Array with many items (all items ignored)"
describe [| |] // => "Empty array"
describe [| 1 |] // => "Array with one item"
describe [| 5; 7 |] // => "Array with two items (first item ignored)"
describe [| 5; 7; 9 |] // => "Array with many items (all items ignored)"
패턴 매칭에서 '_' 하나는 항상 _마지막_에 와야 해요. 다른 경우 중 어디에도 해당하지 않는 값은 모두 이 경우에서 처리돼요.