Форум программистов, компьютерный форум, киберфорум
loothood
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Пятничный Elm (Часть IV)

Запись от loothood размещена 09.01.2016 в 15:43
Показов 1412 Комментарии 0

Пятничный Elm. Hello World 2.0 (Часть IV)


О серии "Пятничный Elm"

Это четвертый пост серии заметок о языке программирования Elm.
Цель данной серии - дать читателям знания от уровня "Что такое Elm" до "Гуру Elm", шаг за шагом.


Hello World 2.0

"Ноги растут" из предыдущей статьи в которой мы написали первую программу на Elm. Напечатать небольшую строку - это, без сомнения, подвиг, но Elm может кое-что еще.
Вот пример как Elm работает со структурами данных и отображает их в HTML(эта программа сортирует список строк и выводит их):


Haskell
1
2
3
4
5
6
7
8
9
10
11
12
import Html
 
names = [ "Pearl", "Steven", "Garnet", "Amethyst" ]
 
main =
  let
    sorted = List.sort names
    texts = List.map Html.text sorted
    textToItem text = Html.li [] [ text ]
    items = List.map textToItem texts
  in
    Html.ul [] items
Сохраните код в файле и посмотрите результат работы программы в браузере.

В примере используется несколько новых концепций Elm. Давайте рассмотрим их:
  • names объявлена как список строк.
  • main - входная точка нашей программы, так же как и в примере про Hello World, хотя и немного сложнее.
  • Тело функции main разделено на две части:
  • в части let мы определили довольно много переменных
  • которые использовали в части in
  • sorted: мы использовали List.sort чтобы отсортировать имена в алфавитном порядке
  • texts: мы использовали List.map чтобы применить функцию Html.text к каждому элементу отсортированного списка. Результат: список элементов типа HTML.text. (Elm не отображает тип данных строка в браузере. Вы всегда должны привести строки к типу HTML.text чтобы отобразить данные).
  • textToItem объявляет новую функцию "на лету". Каждый элемент HTML.text оборачивается в функцию HTML.li, которая по сути является тегом
  • items: мы снова использовали List.map чтобы применить функцию textToItem к каждому элементу списка texts. В результате получаем список элементов HTML li.
  • Наконец, в части программы in функции main мы оборачиваем в список элементов li в элемент HTML ul который переводит в тег <ul>


Атрибуты

Возможно, вы обратили внимание на пустой список [] вторым параметром, когда мы вызывали функции Html.li и Html.ul. Почти все функции из модуля HTML принимают два аргумента: список атрибутов и список внутренних элементов. Первый аргумент(атрибуты) может быть использован чтобы установить css класс, внутренние стили, слушатель событий или что-нибудь еще, что можно представить как атрибут HTML. Второй аргумент - список внутренних элементов - список HTML элементов которые могут быть представлены как новый HTML элемент.
Давайте рассмотрим подробнее. Этот код устанавливает некоторые внутренние стили для отображения контента по центру страницы и меняет шрифт:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import Html
import Html.Attributes
 
names = [ "Pearl", "Steven", "Garnet", "Amethyst" ]
 
main =
  let
    sorted = List.sort names
    texts = List.map Html.text sorted
    textToItem text =
      Html.li
        [ Html.Attributes.style [("font-style", "italic") ] ]
        [ text ]
    items = List.map textToItem texts
  in
    Html.div
      [ Html.Attributes.style
        [ ("position", "absolute")
        , ("width", "10em")
        , ("height", "10em")
        , ("top", "50%")
        , ("left", "50%")
        , ("transform", "translateX(-50%) translateY(-50%)")
        , ("overflow", "hidden")
        ]
      ]
      [ Html.ul [] items ]
Мы импортировали новый модуль Html.Attributes, в котором описаны функции для работы с атрибутами. В данном случае есть два отличия от предыдущего примера:
У элементов li теперь не пустой список атрибутов. Мы использовали функцию Html.Attributes.style чтобы установить стиль font-style.
Так же мы обернули тег <ul> в div, который так же содержит список внутренних стилей. Эти стили отображают div в центре страницы.

В примере можно увидеть новые типы данных. Функция style принимает список кортежей. Кортежи чем-то похожи на списки - они так же могут содержать коллекции из нескольких элементов. Но есть два важных отличия: все элементы списка должны быть одинакового типа и у списков нет фиксированной длины. Элементы кортежа могут быть различных типов, но длина кортежа фиксирована. Количество элементов и их типы вместе составляют тип кортежа. Таким образом, вы не можете передать кортеж с тремя(или одним) элементом в функции, которые ожидают кортежи из двух элементов. Другими словами, кортежи - это пары(или триплеты, четверки,...) значений. В Elm кортежи заключены в круглые скобки.

В нашем случае, каждый стиль - это кортеж из двух строк и аргумент стиля - перечень таких кортежей.

оригинал
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru