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 패턴을 사용한 패턴 매칭으로 직접 다룰 수 있어요:
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)"
패턴 매칭에서 '_'는 항상 _마지막_에 와야 해요. 다른 어떤 경우와도 일치하지 않는 값은 모두 이 경우에서 처리돼요.
지난 7일 동안 정원에 새가 몇 마리 찾아왔는지 기록하는 열성적인 새 관찰자예요.
정원을 찾아온 새의 수를 다루는 여섯 가지 과제가 있어요.
비교를 위해 지난주 기록을 항상 가까이에 복사해 두는데, 그 값은 0, 2, 5, 3, 7, 8, 4예요. 지난주 기록을 담은 lastWeek 바인딩을 정의해요:
lastWeek
// => [| 0; 2; 5; 3; 7; 8; 4 |]
yesterday 함수를 구현해서 어제 정원을 찾아온 새의 수를 반환해요. 새 기록은 날짜 순으로 정렬되어 있고, 첫 번째 원소는 가장 오래된 날의 기록, 마지막 원소는 오늘의 기록이에요.
yesterday [| 3; 5; 0; 7; 4; 1 |]
// => 4
total 함수를 구현해서 정원을 찾아온 새의 총 마릿수를 반환해요:
total [| 3; 5; 0; 7; 4; 1 |]
// => 20
dayWithoutBirds 함수를 구현해요. 정원에 새가 한 마리도 찾아오지 않은 날이 있다면 true를, 그렇지 않으면 false를 반환해요:
dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true
incrementTodaysCount 함수를 구현해서 오늘의 기록을 하나 늘리고 갱신된 기록을 반환해요:
let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]
지난 한 해 동안, 몇몇 주가 다음과 같은 동일한 특이한 패턴을 보인다는 것을 알게 됐어요:
이번 주의 새 기록 패턴이 이 특이한 패턴 중 하나와 일치하면 true를 반환하는 unusualWeek 함수를 구현해요:
unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true
unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true
(날짜의 홀짝은 0부터가 아니라 1부터 시작해요. 배열의 첫 번째 원소가 홀수 번째 날에 해당해요)
Exercism에 가입하고 F# 트랙을 개념 18개연습 문제 148개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.