Каква е бряст част 1

В първата част на статията обхваща основите и синтаксис.

Hellow WORLD

Напиши първото заявление на Елм. Създаване на директория за прилагането и изпълнете следната команда:







Така че ние ще създадем HTML модул. След това добавете Hello.elm файл със следния код:

Сменяме до тази директория и стартирайте:

Ние трябва да видите следното:

Въпреки че няма да се обърне внимание на vorning за липсващи тип анотация за основна, ние ще стигнем до това по-късно.

Нека да разгледаме това, което правим.

Брястът ние трябва да внасяме изрично модулите, които искаме да използваме. В този случай, ние използваме Html модул.

Този модул съдържа набор от функции за работа с HTML. Ще използваме .text. така че ние внасяме функцията в настоящите Пространствата от имена, използвайки това, че излагането.

Front-крайните приложенията да стартират от Елм основната функция разговор. която връща елемента за изобразяване на страницата. В този случай - Html елемент генерира текст функция.

Elm реактор

реактор Екип бряст създава сървър, който съставя Elm код в движение. Реакторът е полезно за развитието на приложения, които не се притеснява много за конфигурацията на процеса на изграждане. Въпреки това, на реактора има своите ограничения, така че по-късно ние се да притежавате процеса на сглобяване.

значими видове

Ще започнем с линиите:

Elm използва оператор (++) за свързване. Имайте предвид, че двете линии запазват формата си, преди да добавите - при добавяне «здравей» и «свят» няма да имаме пропуски.

Нищо особено в изчисленията:

Основи функции

Помислете за основите на синтаксиса на език, за да се запознаете с функциите, функционални подписи, частично прилагане Фънки и тръба-оператор.

Да разгледаме функцията на Елм:

Първият ред - пример за функцията за подпис. Подписите не се изискват в Elm, но се препоръчва да се използва, тъй като той дава яснота функция по предназначение.

Добави тази функция може да отнеме две цели числа (Int -> Int) и връща друг число (трета -> Int).

Следваща виждаме функция на тялото - х + у - което просто се връща сумата от двата параметъра.

Ние можем да наричаме тази функция по следния начин:

групиране на скоби

Ако искаме да извикаме функцията, минавайки го резултатът от друга функция, трябва да използвате скоби в група призовава:

Тук разделение 12 март добавка резултат се предава като втори параметър.

За сравнение, на много езици, тя ще изглежда така:

частично приложение

Брястът можем да вземем на функцията, например, добави горния пример, както и да го наричаме като преминават само един аргумент, т.е. добавете 2.

Тази функция връща стойност различна 2. вързани като първи аргумент. Извикването на тази функция ще се върне към втория аргумент 2 + стойността на аргумента:

На функции на подпис, като добавка. Int -> Int -> Int. можете да погледнете от друга страна - това е функция, която използва едно цяло число и връща друга функция. Получената функция взема още една единица и връща резултата.

Частично прилагане е много полезен в Elm, тъй като Това прави кода по-разбираеми и ви позволява да премине на държавата между функциите в заявлението.

Pipe оператор

Както е показано по-горе, е възможно да се постави разговори до функции като този:

Това е един примитивен пример, но си представим по-сложно:

Тя се основава на частичното прилагане. В този пример, стойността три се предава частично прилагат функции размножават 2. Неговата резултат на свой ред предава друг частична функция приложение се добавя 1.

Използване на оператора на тръба, можем да пренаписване на комплекс примера на по-горе начин:

Повече за функции

типове променливи

Да разгледаме функцията с подписа:

Тази функция може да отнеме хипотетичен низ и връща масив от низове, а индексът на масива, което бе открито от преминали низ или -1. ако не може да намери.

Но какво, ако имаме масив от цели числа? Ние не бихме могли да използвате тази функция. Въпреки това, можем да направим тази функция генерализирана (обща), като се използват променливи като или заместител (стоят в системата), вместо на специфични видове променливи.

След смяна на String на. подпис сега означава, че indexOf отнема стойност от всякакъв вид, както и набор от същия тип а. и връща цяло число. Докато съответстват на видовете, компилаторът ще бъде удоволствие. Ние можем да се обадя, за да indexOf String и масив от String или Int и масив от Int. и той ще работи.

По същия начин, функцията може да се направи по-общо. Ние можем да имаме няколко променливи, като например:

Тази функция може да отнеме един кортеж (кортеж) типове а и б. и б, и връща кортеж. Всички тези предизвикателства са валидни:

Функции като аргументи

  • Счита функция: част (Int -> String)
  • Списък на числа
  • Връща списък от низове

Ние сме заинтересовани в една част (Int -> String). Тя казва, че функцията, съответстващ на подписа (Int -> String), следва да бъдат прехвърлени.

Например, стандартната библиотека ToString е такава функция. Следователно, можем да извикаме функцията карта по този начин:

Но Int и String твърде специфични. Ето защо, повечето от подписването ще изглежда така:

Такава функция mapit списък в списък б. Не ни пука какво А и Б са най-важното, за да предадат на функцията използва едни и същи видове.

Например, с функции като подписи:

Ние може да доведе до обща карта по този начин:

Ако изразът

Ако се нуждаем от клонове, ние използваме израза ако-:

Ключови думи, ако след друго се използват за различни условия и два клона, така че ние не се нуждаем скоби.

Elm нямаше дефиниция на "истината", така че числата, низове, списъци не могат да бъдат използвани като логически стойности. Ако се опитаме да направим това, Elm ни казва, че ние трябва да използваме тези булеви стойности.







Напишете функция, която ще отговори дали предава броят им е по-голяма от 9000:

Се използва наклонена черта в REPL ни позволява да разбие кода на няколко линии, които ние използваме в over9000 функция по-горе. Освен това, тя е най-добрата практика - винаги носи тялото на функция на реда по-долу, този код е по-монотонен и по-лесен за четене.

Списъци могат да съдържат множество от стойности, които трябва да бъдат от същия тип. Няколко примера, които използват някои библиотечни функции:

Отново - всички елементи на списъка трябва да принадлежат към един и същи тип.

Кортежи - един по-полезна структура на данните. А кортеж може да съдържа определен брой стойности, с произволна стойност може да бъде от всякакъв тип. Типични приложения - да се върнат повече от една стойност от функция. Тази функция може да отнеме име и извежда съобщение за потребителя:

То може да бъде удобно, но и сложността на нещата, често по-добре да се използват записите.

Така че ние можем да създадем запис с помощта на скоби и адресни полета през точката. Elm също има възможността да се позоват на записа, който функционира като функция. В очакване на името на променливата точка, ние казваме "да получите стойността на полето със същото име." Това означава, че .name - функция, която получава стойността на записа за име на поле.

Когато става дума за използване на записи в функции, можем да използваме модел съвпадение да се опрости живота си?

Това означава, че можем да предадем на всяко влизане, ако има поле възраст. който включва редица.

Също така често се налага да актуализира информацията в този списък:

Важно е да се отбележи, че ние не произвеждат разрушителни актуализации. Когато се актуализира всеки законопроект поле запис, ние, всъщност, създаден нов запис, а не да замени стария. Elm прави толкова ефективно, като се използват общи данни, където е възможно. Ако актуализираме една от областите, десет, новото попълнение ще споделят ценностите на останалите девет полета с оригиналния запис.

Сравняване на обекти и записи

  • Вие не може да се отнася до област, която не съществува
  • Не поле не може да бъде нула (недефинирана. W) или да включва нула
  • Не можете да създавате рекурсивни влизане, използването на тази или самостоятелно.

Elm насърчава стриктното разделяне на данни и логика, както и способността да използвате тази. използва главно за отделяне на такива разстройства. Това е често срещан проблем на всички обектно-ориентирани езици, които Elm умишлено заобикаля.

Записи също поддържат структурната типизирането, което означава, че те могат да бъдат използвани във всяка ситуация, докато желаната областта съществува. Това ни дава гъвкавост без компромис надеждност.

Внос и модули

Брястът внасяме модул с помощта на вноса на ключова дума:

Така че ние сме направили внос Html модул от стандартната библиотека. След това, ние можем да използваме функциите и видовете този модул, пълния път:

Ние също може да направи внос на модула и изнесе своите специфични функции и видове:

Разделение в момента е в настоящия обхват. Ето защо, ние можем да го наречем направо:

Можем дори да постави цялото съдържание на модула:

След това можем да използваме всеки тип функция и модула директно. Но това не се препоръчва да се направи така, защото това ще доведе до двусмисленост и възможните пресечни точки между модулите.

Модули и типове със същото име

От множество модули със същото име изнасяните видове. Например, HTML модул съдържа тип HTML. и модул Задача - Задача тип.

Ето защо, тази функция, която връща Html елемент:

В първия случай, ние внасяме само Html модул и да използвате пълния път Html.Html.

Второ - ние излагайте Html Html тип модул. и след това да използвате директно този тип.

Главна - името на модула. излагайки (..) означава, че ние искаме да се сложи всички функции и видове на този модул. Elm очаква този модул Main.elm файл. т.е. файл със същото име като на модула.

Ние можем да имаме една по-сложна структура на файловете в заявлението. Например Играчите / Utils.elm файл, трябва да имат следната декларация:

модул Players.Utils излагане (..)

Внос този модул навсякъде в приложението, можете да направите следното:

тип съюз

В Elm, тип на Съюза се използва за много неща, защото на тяхната изключителна гъвкавост. Тип на Съюза е, както следва:

Отговорът може да бъде или Да. или No. типа на Съюза са полезни за привеждане на кода, за да кажа нещо повече от обобщение. Например, една функция обявена, както следва:

Може да отнеме Да или Не като порите на аргумента, например, отговори Да - правилен кол.

типа на Съюза се наричат ​​още тагове в Elm.

съдържание

типа на Съюза могат да съдържат данни вътре:

В този случай, на маркера Другия ще съдържа определен низ. Ние можем да отговорим на обадите по този начин:

Трябва да използвате скоби, в противен случай Elm го приема като функция за прехвърляне на два аргумента реагират.

конструкторът

Нека разгледаме как ние придаваме на данни към други:

Тя изглежда точно като на повикване Други функции. видове съюз се държат като функции. Например, тип:

Ние можем да създадете етикет съобщение като това:

Можем да използваме частично прилагане, както и с обикновени функции. Обикновено, получена функция се нарича конструктор, защото ние можем да ги използваме, за да се изгради пълно копие, т.е. използвате съобщението. за да получите (Message 1 "Hello").

гнездене

Много чести гнездене видове съюз:

След това можем да извикате функция отговори. който очаква Отговор. по следния начин:

Можете също да използвате променливи като типове в Съюза:

Този отговор. който може да съдържа данни от различни типове, например, Int. String.

Така например, реагират функция може да изглежда така:

Тук ние заявяваме, че даден тип трябва да бъде Int. Използването подпис Отговор Int.

По този начин, ние можем да отговорим на обадя, както следва:

Но не е в състояние да се обадя, за да се отговори (Other "Hello"), тъй като реагира очаква цяло число на мястото на.

типични yuzkeys

Един възможен начин за прилагане на видове съюзи - стойности за пренос, които могат да принадлежат към определена група.

Например, в един типичен уеб приложение, има действия, които могат да се извършват от лице или от самото приложение, например, товарене членове, добавяйки, като премахнете даден потребител и т.н. Някои от тези действия могат да пренасят данни.

Обикновено се използва за внос на този вид съюзи:

Псевдоними видове (тип псевдоними)

Типовете Elm псевдоними, както подсказва и името - са псевдоними за най-различни неща. Така например, в езика са видовете Int и String. Ние можем да създадем прякори за тях:

Затова създадохме няколко вида псевдоними, които току-що са дадени видовете стандартна библиотека. Това е удобно, тъй като такава функция:

Можем да го пренапише така:

Така че е много по-ясно какво точно става това.

записване Definition в Elm изглежда така:

Ако имахме нужда от функция, която отнема запис, ние ще пиша подписа си, както следва:

Доста скучен, но псевдоними могат да бъдат полезни тук:

Така че ние псевдоним с Player. което показва определянето на записа, и след това се използва псевдоним в подпис функция.

конструкторите

видове псевдоними могат да бъдат използвани като конструктор функции. Т.е. ние можем да се създаде копие на записа, чрез псевдоним, като функция.

Тук сме създали псевдоним Player. След това, което наричаме Player като функция с два аргумента, че ни връща към записа с правилните атрибути. Имайте предвид, че редът на аргументите да се определи кои ценности ще има атрибути.

Празен кортеж - () - наречена Unit. Той е толкова общ, че тя заслужава някакво обяснение.

Помислете тип променлива тип псевдоним (представена от):

Ние можем да създадем функция, която очаква атрибут Съобщението тип тяло низ по следния начин:

Или функция, която очаква Съобщението, чието тяло - списък от числа:

Но какво да кажем за функции, които не изискват стойност в организма. За да направите това, ние използваме устройството, което показва, че тялото на съобщението (тяло) трябва да е празен:

Тази функция може да отнеме ми с празен тяло. Това не е никаква стойност, и тя е празна.

Така, вида на единица обикновено се използва като заместител за празни стойности.

Казус - Задача тип. При използване на задачите. единица ще се срещнат доста често.

Типичен задача (задача) съдържа грешка и в резултат на:

  • Понякога имаме нужда от една задача, грешка, която може безопасно да се игнорира: Задача () води
  • Или не обърна внимание на резултата: Задачи грешка ()
  • Или комбинация от двете: Задача () ()