Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Elm - это предметно-ориентированный язык программирования для декларативного создания графических пользовательских интерфейсов на основе веб-браузера . Elm является чисто функциональным и разработан с упором на удобство использования , производительность и надежность . Он объявляет «отсутствие исключений во время выполнения на практике» [6], что стало возможным благодаря статической проверке типов компилятором Elm .

История [ править ]

Первоначально Elm был разработан Эваном Чаплицки в качестве его диссертации в 2012 году. [7] Первый выпуск Elm сопровождался множеством примеров и онлайн-редактором, который упростил опробование в веб-браузере . [8] Эван присоединился к Prezi в 2013 году, чтобы работать над Elm [9], а в 2016 году перешел в NoRedInk в качестве инженера с открытым исходным кодом, также основав Elm Software Foundation. [10]

Первоначальная реализация компилятора Elm нацелена на HTML , CSS и JavaScript . [11] Набор основных инструментов продолжал расширяться, теперь он включает REPL , [12] менеджер пакетов , [13] путевой отладчик [14] и установщики для macOS и Windows. [15] Elm также имеет экосистему библиотек, созданных сообществом, и Ellie , продвинутый онлайн-редактор, который позволяет сохранять работу и включать библиотеки сообщества.

Особенности [ править ]

Elm имеет небольшой набор языковых конструкций, включая традиционные if-выражения, let-выражения для локального состояния и case-выражения для сопоставления с образцом . [16] Как функциональный язык, он по умолчанию поддерживает анонимные функции , функции в качестве аргументов и частичное приложение. Его семантика включает неизменяемые значения, функции без состояния и статическую типизацию с выводом типа. Программы Elm визуализируют HTML через виртуальную модель DOM и могут взаимодействовать с другим кодом, используя «JavaScript как услугу».

Неизменяемость [ править ]

Все значения в Elm неизменяемы , что означает, что значение не может быть изменено после его создания. Elm использует постоянные структуры данных для реализации своей Array, Dictи Setбиблиотеки. [17]

Статические типы [ править ]

Вяз статически типизирован. Аннотации типов не являются обязательными (из-за вывода типов), но настоятельно рекомендуется. Аннотации находятся в строке над определением (в отличие от языков семейства C, где типы и имена перемежаются). Elm использует одно двоеточие для обозначения «имеет тип».

Типы включают примитивы, такие как целые числа и строки, и базовые структуры данных, такие как списки, кортежи и записи. Например, функции имеют типы, написанные стрелками round : Float -> Int. Пользовательские типы позволяют программисту создавать пользовательские типы для представления данных в соответствии с предметной областью. [18]

Типы могут относиться к другим типам, например к файлу List Int. Типы всегда пишутся с заглавной буквы; Имена в нижнем регистре - это переменные типа. Например, a List a- это список значений неизвестного типа. Это тип пустого списка и аргумента List.length, который не зависит от элементов списка. Есть несколько специальных типов, которые программисты создают для взаимодействия со средой выполнения Elm. Например, Html Msgпредставляет (виртуальное) дерево DOM, все обработчики событий которого создают сообщения определенного типа Msg.

Вместо того, чтобы разрешать любому значению быть неявно допускающим значение NULL (например, JavaScript undefinedили нулевой указатель ), стандартная библиотека Elm определяет Maybe aтип. Код, который создает или обрабатывает необязательное значение, делает это явно с использованием этого типа, а для всего остального кода гарантируется, что значение заявленного типа действительно присутствует.

Elm предоставляет ограниченное количество встроенных классов типов : numberчто включает в себя Intи Floatдля облегчения использования числовых операторов, таких как (+)или (*), comparableкоторый включает числа, символы, строки, списки сопоставимых объектов и кортежи сопоставимых объектов для облегчения использования сравнения. операторы, и appendableкоторый включает строки и списки для облегчения конкатенации с (++). Elm не предоставляет механизма для включения пользовательских типов в эти классы типов или создания новых классов типов (см. Раздел «Ограничения»).

Модульная система [ править ]

У Elm есть модульная система, которая позволяет пользователям разбивать свой код на более мелкие части, называемые модулями. Модули могут скрывать детали реализации, такие как вспомогательные функции, и группировать связанный код вместе. Модули служат пространством имен для импортированного кода, например Bitwise.and. Сторонние библиотеки (или пакеты) состоят из одного или нескольких модулей и доступны в публичной библиотеке Elm . Все библиотеки версируются в соответствии с semver , который обеспечивается компилятором и другими инструментами. То есть удалить функцию или изменить ее тип можно только в основной версии.

Совместимость с HTML, CSS и JavaScript [ править ]

Elm использует абстракцию, называемую портами, для связи с JavaScript . [19] Он позволяет значениям поступать в программы Elm и исходить из них, что делает возможным взаимодействие между Elm и JavaScript.

У Elm есть библиотека elm / html, которую программист может использовать для написания HTML и CSS в Elm. [20] Он использует подход виртуальной модели DOM для повышения эффективности обновлений. [21]

Бэкэнд [ править ]

Elm официально не поддерживает разработку на стороне сервера. Основная команда разработчиков не считает это своей основной целью и предпочитает сосредоточить разработку на улучшении опыта фронтенд-разработки. Тем не менее, есть несколько независимых проектов, которые пытаются изучить возможности использования Elm в качестве серверной части. Проекты в основном застряли на Elm версии 0.18.0, так как более новые не поддерживают «родной» код и некоторые другие используемые функции. Есть две попытки использовать Elm с BEAM (виртуальная машина Erlang). Один из проектов выполняет Elm непосредственно в среде [22], а другой компилирует его в Elixir. [23] Также была предпринята попытка создать внутреннюю структуру для Elm на базе инфраструктуры Node.js. [24] Ни один из проектов не готов к производству.

Архитектура Вяза [ править ]

Elm Architecture - это шаблон для создания интерактивных веб-приложений. Приложения Elm естественно строятся таким образом, но другие проекты могут найти эту концепцию полезной.

Программа Elm всегда делится на три части:

  • Модель - состояние приложения
  • Просмотр - функция, которая превращает модель в HTML
  • Обновление - функция, обновляющая модель на основе сообщений

Это ядро ​​Elm Architecture.

Например, представьте себе приложение, которое отображает число и кнопку, увеличивающую число при нажатии. [25] В этом случае все, что нам нужно сохранить, - это одно число, поэтому наша модель может быть такой же простой, как type alias Model = Int. viewФункция будет определена с Htmlбиблиотекой и отображение номера и кнопки. Чтобы номер обновлялся, нам нужно иметь возможность отправлять сообщение updateфункции, что осуществляется с помощью настраиваемого типа, например type Msg = Increase. IncreaseЗначение прикрепили его к кнопке , определенной в viewфункции таким образом, что при нажатии кнопки пользователем, Increaseпередается в updateфункцию, которая может обновить модель за счет увеличения числа.

В архитектуре Elm отправка сообщений update- единственный способ изменить состояние. В более сложных приложениях сообщения могут поступать из различных источников: взаимодействие с пользователем, инициализация модели, внутренние вызовы update, подписки на внешние события (изменение размера окна, системные часы, взаимодействие JavaScript ...), а также изменения и запросы URL-адресов.

Ограничения [ править ]

Elm не поддерживает более высокий-kinded полиморфизма , [26] , который родственные языки Haskell и PureScript предложение, а также не поддерживают Elm создания классов типа .

Это означает, что, например, у Elm нет универсальной mapфункции, которая работает с несколькими структурами данных, такими как Listи Set. В Elm такие функции обычно вызываются с указанием имени модуля, например, вызывая List.mapи Set.map. В Haskell или PureScript будет только одна функция map. Это известный запрос функции, который находится в приблизительной дорожной карте Чаплицки как минимум с 2015 года. [27]

Другой результат - большой объем шаблонного кода в проектах среднего и большого размера, как показано автором «Вяза в действии» в их примере одностраничного приложения [28], при этом почти идентичные фрагменты повторяются при обновлении, просмотре, подписках, разборе маршрута. и строительные функции.

Пример кода [ править ]

- Это однострочный комментарий.{- это многострочный комментарий. Это {- гнездо. -} -}- Здесь мы определяем значение с именем «welcome». Тип выводится как `String`. приветствие  =  "Hello World!" - Лучше всего добавлять аннотации типов к объявлениям верхнего уровня. привет  :  String hello  =  "Привет."- Функции объявляются таким же образом, с аргументами, следующими за именем функции. добавить  x  y  =  x  +  y- Опять же, лучше всего добавлять аннотации типов. гипотенуза  :  Float  ->  Float  ->  Float гипотенуза  a  b  =  sqrt  ( a ^ 2  +  b ^ 2 )- Функции также каррированы; здесь мы каррировали оператор умножения - инфикс с `2` multiplyBy2  :  number  ->  number multiplyBy2  =  (*)  2- If-выражения используются для перехода по значениям `Bool` absoluteValue  :  number  ->  number absoluteValue  number  =  if  number  <  0  тогда  отрицать  число  иначе  число - Записи используются для хранения значений с именованными полями book  :  {  title  :  String ,  author  :  String ,  pages  :  Int  } book  =  {  title  =  "Steppenwolf"  ,  author  =  "Hesse"  ,  pages  =  237  }- Доступ к записи осуществляется с помощью `.` title  :  String title  =  book . заглавие- Доступ к записи `.` также может использоваться как автор  функции :  String author  =  . авторская  книга- Мы можем создавать помеченные союзы с ключевым словом `type`. - Следующее значение представляет двоичное дерево. Тип  Дерево  a  =  Пусто  |  Узел  a  ( Дерево  a )  ( Дерево  a )- Эти типы можно проверять с помощью case-выражений. Глубина  :  Дерево  -> Int глубина дерева = корпус дерево из Empty -> 0            Значение  узла слева  направо  ->  1  +  макс  ( глубина  слева )  ( глубина  справа )

См. Также [ править ]

  • PureScript : строго типизированный, чисто функциональный язык программирования, который компилируется в JavaScript.
  • Причина : расширение синтаксиса и набор инструментов для OCaml, которые также могут быть преобразованы в JavaScript.

Ссылки [ править ]

  1. ^ Czaplicki, Эван. «Моя диссертация наконец завершена!« Вяз: параллельный FRP для функциональных графических интерфейсов » » . Reddit .
  2. ^ https://github.com/elm/compiler/releases
  3. ^ "вяз / компилятор" . GitHub .
  4. ^ "Предыдущее искусство - Redux" . redux.js.org .
  5. ^ «Сравнение с другими фреймворками - Vue.js» .
  6. ^ "Домашняя страница Elm" .
  7. ^ «Вяз: параллельный FRP для функциональных графических интерфейсов» (PDF) .
  8. ^ "Попробуйте вяз" . elm-lang.org . Архивировано из оригинала на 2017-05-21 . Проверено 24 июля 2019 .
  9. ^ "вяз и прези" . elm-lang.org .
  10. ^ "Новые приключения вяза" . elm-lang.org .
  11. ^ "вяз / компилятор" . GitHub .
  12. ^ "ответ" . elm-lang.org .
  13. ^ "менеджер пакетов" . elm-lang.org .
  14. ^ "Дом" . elm-lang.org .
  15. ^ "Установить" . guide.elm-lang.org .
  16. ^ "синтаксис" . elm-lang.org . Архивировано из оригинала на 2016-03-13 . Проверено 31 мая 2013 .
  17. ^ "вяз / ядро" . package.elm-lang.org .
  18. ^ "Модель проблемы" . Вяз . Дата обращения 4 мая 2016 .
  19. ^ "JavaScript interop" . elm-lang.org .
  20. ^ "вяз / html" . package.elm-lang.org .
  21. ^ «Молниеносно быстрый HTML» . elm-lang.org .
  22. ^ https://github.com/hkgumbs/elm-beam
  23. ^ https://github.com/wende/elchemy
  24. ^ https://github.com/AIRTucha/board
  25. ^ "Кнопки · Введение в вяз" . guide.elm-lang.org . Проверено 15 октября 2020 .
  26. ^ "Высшие типы не выразимы? # 396" . github.com/elm-lang/elm-compiler . Проверено 6 марта 2015 года .
  27. ^ "Высшие типы не выразимы # 396" . github.com/elm-lang/elm-compiler . Проверено 19 ноября 2019 .
  28. ^ "Main.elm" . github.com/rtfeldman/elm-spa-example . Проверено 30 июня 2020 .

Внешние ссылки [ править ]

  • Официальный веб-сайт