Elm - це чудова мова для створення надійних вебзастосунків. У неї дружні повідомлення про помилки, висока продуктивність, невеликий розмір зібраного коду і жодних винятків під час виконання.
Мабуть, найвідоміша й найчастіше копійована частина Elm - The Elm Architecture. Це простий підхід до структурування вебзастосунків, і саме так пишуть усі вебзастосунки на Elm.
Основна ідея полягає в тому, що код будується навколо Model - моделі стану застосунку, функції update, яка цю модель оновлює, і функції view, яка її показує.
Model містить стан застосунку, тобто всі дані, які йому потрібні. Якщо уявити простий застосунок із текстовим полем і текстом, що показує цей текст у зворотному порядку, модель матиме такий вигляд. Цей самий приклад можна також побачити в Elm Guide.
type alias Model =
{ text : String
}
update - це функція, яку викликають із Msg, коли щось змінюється (наприклад, користувач натискає кнопку). Вона приймає Msg і поточний Model та повертає новий Model.
type Msg
= TextChanged String
update : Msg -> Model -> Model
update msg model =
case msg of
TextChanged newText ->
{ model | text = newText }
view - це функція, яка повертає HTML, що його браузер показує користувачу. Вона приймає поточний Model і повертає Html Msg (тип, яким Elm позначає HTML).
view : Model -> Html Msg
view model =
Html.div []
[ Html.input
[ Html.Attributes.placeholder "Text to reverse"
, Html.Attributes.value model.text
, Html.Events.onInput TextChanged
]
[]
, Html.div [] [ Html.text (String.reverse model.text) ]
]
Ваша подруга Паула намагається краще розгадувати підказки в кросвордах. Вона прочитала, що деякі підказки вказують на те, що відповідь є паліндромом. Паліндром - це слово або речення, яке читається однаково в обидва боки.
Вона просить написати їй дуже простий вебсайт, який перевірятиме, чи є рядок тексту (англ. string) паліндромом, щоб вона могла перевіряти свої здогади.
Ми вирішуємо зробити це за допомогою застосунку [sandbox][browser-sandox] на Elm.
Застосунок матиме текстове поле, у яке Паула зможе вводити свій здогад, і текст, який повідомлятиме, чи є текст у полі паліндромом. Текст оновлюватиметься щоразу, коли текст у текстовому полі змінюється.
Model і Msg для застосунку та напишіть функцію init
Типу Model застосунку потрібен рядок тексту для перевірки, і це поле має називатися content.
Застосунку потрібен Msg, щоб позначити, що текст у текстовому полі змінився.
Відповідний варіант має називатися Change.
Функція init має повертати початкове значення Model з порожнім полем content.
update
Функція update має приймати параметри Msg і Model та повертати новий Model.
Msg нестиме текст, який ввів користувач, а новий Model має містити цей текст.
view
Elm вимагає, щоб функція view повертала тип Html msg, а це означає, що з функції view потрібно повернути один елемент (а не масив елементів).
Усередині цього кореневого елемента мають бути елемент input (текстове поле) і div із вмістом text, який показує, чи є текст у input паліндромом.
Текст має бути «This is a palindrome» або «Not a palindrome».
main
Функція main має викликати Browser.sandbox, передаючи параметр-запис із функціями init, update і view.
Щоб вправа працювала в онлайн-редакторі Exercism, ми використовуємо підроблений Browser.sandbox разом із кодом.
Для коду, який ми пишемо, щоб розвʼязати цю вправу, це нічого не змінює.
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elm, а також 28 концепцій110 вправ та справжнє наставництво від людей, і все це безкоштовно.