트랙
/
F#
F#
/
연습 문제
/
트랙 위의 트랙 위의 트랙
트랙 위의 트랙 위의 트랙

트랙 위의 트랙 위의 트랙

학습 연습 문제

소개

배열

F#의 list는 0개 이상의 값을 담는 불변 컬렉션이에요. 배열의 값은 모두 같은 타입이어야 해요. 배열은 불변이기 때문에 한 번 만들어지면 그 값은 절대 바뀌지 않아요. 배열을 수정하는 것처럼 보이는 함수나 연산자(예: 원소 추가)는 실제로는 새로운 배열을 반환해요.

배열은 다음과 같이 정의할 수 있어요:

let empty = []
let singleValue = [5]
let threeValues = ["a"; "b"; "c"]

배열에 원소를 추가하는 가장 일반적인 방법은 :: (cons) 연산자를 사용하는 거예요:

let twoToFour = [2; 3; 4]
let oneToFour = 1 :: twoToFour
// => [1; 2; 3; 4]

F# 배열에는 head(첫 번째 원소)와 tail(첫 번째 원소 뒤에 오는 모든 것)이 있어요. 배열의 tail은 그 자체가 배열이에요.

배열은 List 모듈에 정의된 함수와 연산자로 다루거나, list 및 cons 패턴을 사용한 패턴 매칭으로 직접 다룰 수 있어요:

let describe list =
    match list with
    | [] -> "Empty list"
    | head::tail -> sprintf "Non-empty list with head: %d" head

describe []        // => "Empty list"
describe [1]       // => "Non-empty with head: 1"
describe [5; 7; 9] // => "Non-empty with head: 5"

패턴 매칭을 할 때 값을 버릴 수도 있어요. 특정 경우에 값에 관심이 없을 때(즉, 값을 사용하지 않을 때)는 밑줄('_')을 사용해 이를 나타낼 수 있어요:

let describe list =
    match list with
    | [] -> "Empty list"
    | [x] -> "List with one item"
    | [_; y] -> "List with two items (first item ignored)"
    | _ -> "List with many items (all items ignored)"

describe []        // => "Empty list"
describe [1]       // => "List with one item"
describe [5; 7]     // => "List with two items (first item ignored)"
describe [5; 7; 9] // => "List with many items (all items ignored)"

'_' 하나는 패턴 매칭에서 항상 _마지막_에 와야 해요. 다른 경우와 일치하지 않는 모든 값은 이 경우가 처리해요.

지침

이 연습 문제에서는 Exercism에서 배우고 싶은 프로그래밍 언어 배열을 관리하는 코드를 작성해요.

여섯 개의 과제가 있고, 모두 배열을 다루는 내용이에요.

1. 새 배열 만들기

배우고 싶은 언어를 계속 관리하려면 새 배열을 만들어야 해요. 비어 있는 새 배열을 담는 newList 바인딩을 정의해요.

newList
// => []

2. 기존 배열 정의하기

지금은 배우고 싶은 언어가 적힌 종이 한 장이 있어요. 바로 F#, Clojure, Haskell이죠. 이 배열을 나타내는 existingList 바인딩을 정의해요.

existingList
// => ["F#"; "Clojure"; "Haskell"]

3. 배열에 새 언어 추가하기

Exercism을 둘러보다가 더 흥미로운 언어를 발견하면 배열에 추가하고 싶어져요. 배열 맨 앞에 새 언어를 추가하는 addLanguage 함수를 구현해요.

addLanguage "TypeScript" ["JavaScript"; "CoffeeScript"]
// => ["TypeScript"; "JavaScript"; "CoffeeScript"]

4. 배열에 있는 언어 세기

언어를 하나씩 세는 건 번거로워요. 배열에 있는 언어의 개수를 세는 countLanguages 함수를 구현해요.

countLanguages ["C#"; "Racket"; "Rust"; "Ruby"]
// => 4

5. 배열 뒤집기

어느 순간, 배열의 순서가 사실 거꾸로 되어 있다는 걸 깨달아요! 배열을 뒤집는 reverseList 함수를 구현해요.

reverseList ["Prolog"; "C"; "Idris"; "Assembly"]
// => ["Assembly"; "Idris"; "C"; "Prolog"]

6. 배열이 흥미진진한지 확인하기

모든 언어를 사랑하지만, F#은 마음속 특별한 자리를 차지하고 있어요. 그래서 다음과 같은 언어 배열이면 정말 신나요:

  • 배열의 첫 번째 항목이 F#이에요.
  • 배열의 두 번째 항목이 F#이고, 배열에 언어가 두 개 또는 세 개 들어 있어요.

언어 배열이 흥미진진한지 확인하는 excitingList 함수를 구현해요:

excitingList ["Nim"; "F#"]
// => true
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
F# Exercism

트랙 위의 트랙 위의 트랙 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 F# 트랙을 개념 18개연습 문제 148개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.