Тип char у F# є 16-бітним значенням, що представляє найменші адресовані компоненти тексту; він типово незмінний.
char можна визначити як літерали в одинарних лапках:
let ch = 'A'
// => val ch: char = 'A'
Рядки тексту (англ. string) є послідовністю символів.
Окремий char можна отримати з рядка тексту за допомогою індексації (з відліком від нуля):
"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 для перетворення рядків тексту (англ. string).
Допустимий ідентифікатор складається з нуля або більше літер, символів підкреслення, дефісів, знаків питання та емодзі.
Якщо до функції 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 вправ та справжнє наставництво від людей, і все це безкоштовно.