Експорт функцій ми розглядали в першій концепції, тож ось коротке нагадування.
Кожен файл в Elm є модулем і повинен містити інструкцію module перед усім іншим кодом.
Назви модулів мають збігатися з назвою їхнього файлу, тож модуль Calculator повинен бути у файлі Calculator.elm, а модуль Parser.Utils має бути у файлі Parser/Utils.elm.
Усе, визначене всередині модуля, має приватну область видимості в ньому й недоступне ззовні цього модуля, якщо його не перелічено в exposing.
-- Calculator.elm
-- Define the Calculator module, and expose the `add` function
module Calculator exposing (add)
six = 3 + 3
add number1 number2 = number1 + number2
-- Calculator.elm
-- Define the Calculator module, and expose everything within: `six` and `add`
module Calculator exposing (..)
six = 3 + 3
add number1 number2 = number1 + number2
https://elm-lang.org/docs/syntax#modules
Доступ до функцій, визначених в інших модулях, відбувається через імпорт. Усі функції цього модуля, які він експортував, стають доступними, коли ми імпортуємо цей модуль. Але те, як ми до них звертаємося, залежить від того, як імпортовано модуль.
Кваліфікований імпорт є типовим, і щоб звернутися до функції в такому модулі (наприклад, функції map у модулі List), ми додаємо перед нею назву модуля (List.map).
Відкритий імпорт дає прямий доступ до експортованих функцій цього модуля без префікса. Його здійснюють за допомогою ключового слова exposing, наче дзеркало того, що використовують в експорті. Ми можемо експортувати всі доступні функції (за допомогою ..) або окремі з них (наприклад, map).
Також можна імпортувати типи та їхні конструктори з інших модулів, але це пізніша концепція.
Кваліфікованому імпорту віддають перевагу задля ясності та уникнення конфліктів імен.
-- qualified imports
import List -- List.map, List.foldl
import List as L -- L.map, L.foldl
-- open imports
import List exposing (..) -- map, foldl, concat, ...
import List exposing ( map, foldl ) -- map, foldl, List.concat
https://elm-lang.org/docs/syntax#modules
Анотації типів визначають за допомогою name : parameter types -> return type, де типи параметрів також розділяють знаком ->.
add : Int -> Int -> Int
add number1 number2 = number1 + number2
Круглі дужки можна використовувати для визначення параметрів функції (які самі визначаються за тим самим синтаксисом, звідси й потреба в дужках).
-- Transform every character in a string
map : (Char -> Char) -> String -> String
map charMapperFunction string =
-- ...
https://elm-lang.org/docs/syntax#type-annotations
В Elm доступні два типи чисел, визначені типами Int і Float.
Int відповідає множині додатних і відʼємних цілих чисел.
Float відповідає множині дійсних чисел, обмеженій точністю компʼютера.
Операції, визначені над числами, зазвичай працюють з одним типом або з іншим, але не змішують їх.
Існують функції для перетворення одного типу в інший, наприклад toFloat, яка перетворює Int на Float, та round, floor, ceiling чи truncate, які перетворюють Float на Int з різною семантикою.
https://package.elm-lang.org/packages/elm/core/latest/Basics#Int
Щоб описувати слова й речення в коді, Elm має вбудований тип String.
Літерали рядків тексту записують між подвійними лапками, наприклад "Hello World!".
Оператор конкатенації рядків тексту ++ та оператор рівності == доступні типово.
hello : String -> String
hello subject = "Hello " ++ subject
hello "World!" --> "Hello World!"
Більшість інших функцій для рядків тексту містяться в модулі String, який потрібно імпортувати.
https://package.elm-lang.org/packages/elm/core/latest/String
У цій вправі ми напишемо трохи коду, щоб допомогти Betty's Bike Shop, інтернет-магазину велосипедів і запчастин. На нас чекають три завдання, мета яких - правильно показувати на сайті ціни на велосипеди та запчастини.
penceToPounds
Наш колега вже написав каркас модуля: невизначені функції penceToPounds і poundsToString.
Однак він забув експортувати функцію penceToPounds, тож інші модулі й набір тестів її наразі не бачать.
Додайте penceToPounds до списку експортованих функцій.
Наразі ціну зберігають як ціле число пенсів (магазин розташований у Великій Британії).
На сайті ми хочемо показувати ціну у фунтах, де 1.00 фунта дорівнює 100 пенсам.
Друге завдання - реалізувати функцію penceToPounds, яка приймає кількість пенсів типу Int і перетворює її на відповідну кількість фунтів типу Float.
Також визначте анотацію типу для цієї функції.
penceToPounds 106
--> 1.06
Оскільки в Betty's Bike Shop велосипеди продають за фунти, ціни слід показувати із символом «£».
Тож третє завдання - реалізувати функцію poundsToString, яка приймає кількість фунтів типу Float і повертає ціну як String із символом фунта на початку.
Модуль String містить функцію String.fromFloat, яка тут стане в пригоді.
Імпортуйте модуль String перед тим, як його використовувати.
Також визначте анотацію типу для poundsToString.
poundsToString 1.06
--> "£1.06"
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elm, а також 28 концепцій110 вправ та справжнє наставництво від людей, і все це безкоштовно.