F#의 char 타입은 텍스트에서 가장 작은 주소 지정 단위를 나타내는 16비트 값이고, 기본적으로 불변이에요.
char는 작은따옴표로 리터럴을 정의할 수 있어요:
let ch = 'A'
// => val ch: char = 'A'
문자열은 char가 나열된 것이에요.
개별 char는 0부터 시작하는 인덱스로 문자열에서 꺼낼 수 있어요:
"Exercism"[4] // => 'c'
문자열을 순회하면 각 단계마다 char를 반환해요.
다음 예제는 편의를 위해 고차 함수와 익명 함수를 사용했어요. 이 둘은 나중에 커리큘럼에서 제대로 다루지만, 지금은 문자열의 문자들을 순회하는 루프를 간결하게 쓰는 방법이라고 생각하면 돼요.
Seq.map (fun c -> c, int c) "F#" // => [('F', 70); ('#', 35)]
위에서 보았듯이 char는 int 값으로 변환할 수 있어요.
이건 다른 문자 체계에서도 (적어도 어떤 경우에는) 동작해요:
Seq.map (fun c -> c, int c) "東京" // => [('東', 26481); ('京', 20140)]
문자를 비교할 때는 그 바탕이 되는 Int16이 사용돼요:
'A' < 'D' // => true
또한 int는 char로 변환할 수 있어요:
char 77 // => 'M'
System.Char 라이브러리에는 .NET 언어에서 기대하는 메서드가 모두 들어 있어요. 대소문자 변환 같은 것들이에요:
'a' |> System.Char.ToUpper // => 'A'
'Q' |> System.Char.ToLower // => 'q'
이 연습 문제에서는 개발자가 식별자 이름을 정리할 수 있도록 돕는 유틸리티 함수 몇 가지를 구현해요.
6개의 과제를 통해 단일 문자를 변환하는 transform 함수와 문자열을 변환하는 clean 함수를 차근차근 완성해 나가요.
유효한 식별자는 0개 이상의 글자, 밑줄, 하이픈, 물음표, 이모지로 이루어져요.
clean 함수에 빈 문자열을 전달하면 빈 문자열이 반환되어야 해요.
하이픈을 밑줄로 바꾸도록 transform 함수를 구현해요.
transform '-' // => "_"
모든 공백 문자를 제거해요. 문자열 앞뒤의 공백도 포함돼요.
transform ' ' // => ""
transform 함수를 수정해 camelCase를 kebab-case로 변환해요.
transform 'D' // => "-d"
transform 함수를 수정해 숫자인 문자는 제외해요.
transform '7' // => ""
transform 함수를 수정해 'α'부터 'ω'까지 범위의 그리스 문자를 바꿔요.
transform 'β' // => "?"
이 연산들을 문자열 전체에 적용하도록 clean 함수를 구현해요.
규칙을 벗어나는 문자는 바뀌지 않고 그대로 남아요.
clean " a2b Cd-ω😀 " // => "ab-cd_?😀"
이 주제는 나중에 교육 과정에서 자세히 다뤄요.
지금은 String.collect라는 고차 함수가 있다는 점을 알아 두면 도움이 될 거예요. 이 함수는 여러분이 제공한 함수를 사용해 char 컬렉션을 문자열로 변환해요.
let transform ch = $"{ch}_"
String.collect transform "abc" // => "a_b_c_"
Exercism에 가입하고 F# 트랙을 개념 18개연습 문제 148개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.