Care este ulm partea 1

Prima parte a articolului se referă la elementele de bază și sintaxa.

Hellow WORLD

Scrieți prima cerere de pe Elm. Creați un director de aplicație și executați următoarea comandă:







Deci, vom crea modulul HTML. Apoi se adaugă fișierul Hello.elm cu următorul cod:

Schimbăm în acest director și rulați:

Ar trebui să vedem următoarele:

Deși nu vom acorda o atenție la vorning despre lipsă de tip adnotare pentru principal, vom ajunge la asta mai târziu.

Să ne uităm la ceea ce facem.

Elm trebuie să importe în mod explicit modulele pe care dorim să le folosească. În acest caz, vom folosi modulul HTML.

Acest modul conține un set de funcții pentru lucrul cu HTML. Vom folosi .text. asa ca am de import funcția în spațiile de nume actuale, folosind deconspirarea.

aplicații front-end pentru a porni de la Elm principal funcția de apel. care returnează elementul pentru redarea paginii. În acest caz - element HTML generat funcția de text.

reactor Elm

reactor Echipa Elm creează un server care compilează codul Elm pe zbor. Reactorul este util pentru dezvoltarea de aplicații care nu deranjez mult despre configurația procesului de construcție. Cu toate acestea, reactorul are limitele sale, astfel încât mai târziu vom ajunge să dețină procesul de asamblare.

tipuri semnificative

Incepem cu liniile:

Elm folosește operatorul (++) pentru concatenare. Rețineți că ambele linii își păstrează forma înainte de a adăuga - atunci când se adaugă «bună ziua» și «lumi» nu vom avea lacune.

Nimic special în calcule:

funcţii Elemente de bază

Luați în considerare elementele de bază ale sintaxei limbii pentru a afla despre funcțiile, semnături ale funcției, aplicarea parțială Funky și țeavă de operator.

Luați în considerare funcția în Elm:

Prima linie - un exemplu al funcției de semnătură. Semnăturile nu sunt necesare în Elm, dar se recomandă utilizarea, ca oferă funcția de claritate intenționată.

Adăugați această funcție are două numere întregi (Int -> Int) și returnează un alt număr întreg (al treilea -> Int).

În continuare vom vedea funcția corpului - x + y - care returnează pur și simplu suma celor doi parametri.

Putem numi această funcție ca aceasta:

gruparea paranteze

Dacă vrem să apela funcția, trecându-l rezultatul unei alte funcții, ar trebui să utilizați paranteze pentru apeluri de grup:

Aici diviza 12 martie add rezultat este transmis ca al doilea parametru.

Pentru comparație, în mai multe limbi, ar arata astfel:

aplicarea parțială

Ulmului putem lua funcția, de exemplu, adăugați exemplul de mai sus, și să-l numesc prin trecerea doar un singur argument, și anume, se adaugă 2.

Această funcție returnează o valoare diferită 2. legat ca un prim argument. Apelarea acestei funcții va reveni la al doilea argument 2 + valoare a argumentului:

Pe caracteristicile de semnătură, cum ar fi add. Int -> Int -> Int. poti sa te uiti pe de altă parte - aceasta este o funcție care are un singur număr întreg și returnează o altă funcție. Funcția rezultată are o unitate de mai multe și returnează rezultatul.

aplicarea parțială este foarte utilă în Elm, deoarece Aceasta face codul mai ușor de citit și vă permite să treacă de stat între funcțiile în cerere.

operatorul țeavă

Așa cum sa arătat mai sus, este posibil să se pună apeluri la funcții, cum ar fi aceasta:

Acesta este un exemplu primitiv, dar imagina un mai complicat:

Ea se bazează pe aplicarea parțială. În acest exemplu, valoarea trei sunt transmise funcții aplicate parțial multiplice 2. Rezultatul său, la rândul său, a transmis o altă funcție de aplicație parțială a adăuga 1.

Folosind operatorul de țeavă, putem rescrie exemplul complex de mai sus astfel:

Mai multe detalii despre caracteristicile

tipuri de variabile

Luați în considerare funcția cu semnătura:

Această funcție ipotetică are un șir și returnează o matrice de coarde și indicele de matrice, care a fost găsit de către șirul trecut sau -1. în cazul în care nu a putut găsi.

Dar ce se întâmplă dacă avem o serie de numere întregi? Noi nu ar putea folosi această funcție. Cu toate acestea, putem face această funcție o generalizată (generic), folosind variabile cum ar fi sau substitut (stand-uri) în loc de anumite tipuri de variabile.

După înlocuirea String pe. semnătură înseamnă acum că indexOf are o valoare de orice tip, precum și o serie de același tip A. și returnează un întreg. Atâta timp cât se potrivesc cu tipurile, compilatorul va fi mulțumit. Putem apela la indexOf String si o serie de String sau Int și matrice de Int. și va funcționa.

În același fel funcția poate fi făcută mai generic. Putem avea mai multe variabile, cum ar fi:

Această funcție are un tuplu (tuplu) tipurile a și b. și b, și returnează un tuplu. Toate aceste provocări sunt valabile:

Funcții ca argumente

  • Ia o funcție: o parte (Int -> String)
  • Listă de numere întregi
  • Returnează o listă de șiruri

Suntem interesati de o parte (Int -> String). Ea spune că funcția corespunzătoare semnăturii (Int -> String) ar trebui să fie transferate.

De exemplu, biblioteca standard toString este o astfel de funcție. Prin urmare, putem apela funcția hartă ca aceasta:

Dar Int și String prea specifice. Prin urmare, cea mai mare parte semnăturii va arata astfel:

O astfel de funcție MapIt o listă în lista b. Nu-mi pasă ce a și b sunt, cel mai important, pentru a transmite funcția utilizează aceleași tipuri.

De exemplu, cu funcții astfel de semnături:

Putem provoca o hartă generalizată ca aceasta:

Dacă expresia

Dacă avem nevoie de ramificare, folosim expresia în cazul în care-:

Cuvintele cheie în cazul în care, atunci altceva sunt folosite pentru termeni separați și două ramuri, așa că nu avem nevoie de acolade.

Elm nu are nici o noțiune de „adevăr“, astfel încât numerele, siruri de caractere, liste nu pot fi folosite ca valori logice. Dacă încercăm să facem acest lucru, Elm ne spune că ar trebui să folosim aceste valori booleene.







Scrieți o funcție care va răspunde dacă numărul transmis este mai mare de 9000:

Utilizarea backslash la Repl ne permite să rupă codul în linii multiple, pe care le folosim în funcție over9000 de mai sus. Mai mult decât atât, este cea mai bună practică - transporta întotdeauna corpul unei funcții pe linia de mai jos, acest cod este mai monoton și mai ușor de citit.

Listele pot conține o multitudine de valori care trebuie să fie de același tip. Câteva exemple care utilizează anumite funcții de bibliotecă:

Din nou - toate elementele listei trebuie să aparțină aceluiași tip.

Perechile - o structură de date mai utile. Un tuplu poate conține un număr fix de valori, cu orice valoare poate fi de orice tip. Aplicațiile tipice - pentru a reveni mai multe valori dintr-o funcție. Această funcție are un nume și returnează un mesaj pentru utilizator:

Poate fi convenabil, dar complexitatea lucrurilor, de multe ori mai bine să se folosească înregistrările.

Deci, putem crea o înregistrare cu ajutorul acolade și câmpurile de adresă prin punctul. Elm are, de asemenea, posibilitatea de a face trimitere la înregistrarea, care funcționează ca o funcție. Anticipând numele punctului variabil, noi spunem „obține valoarea câmpului cu același nume.“ Acest lucru înseamnă că .name - o funcție care primește valoarea intrării câmpul de nume.

Când vine vorba de utilizarea înregistrărilor în funcții, putem folosi model de potrivire pentru a simplifica viata ta?

Asta este, putem transmite orice intrare în cazul în care are câmp de vârstă. care cuprinde un număr.

De asemenea, de multe ori necesitatea de a actualiza datele din înregistrarea:

Este important să rețineți că noi nu producem actualizări distructive. Când vom actualiza orice proiect de lege de înregistrare domeniu, noi, de fapt, a crea o intrare nouă, mai degrabă decât suprascrie pe cel vechi. Elm face acest lucru în mod eficient, folosind date comune, acolo unde este posibil. Dacă actualizăm unul din cele zece domenii, noua intrare va împărtăși valorile cele nouă câmpuri rămase cu înregistrarea originală.

Comparând obiecte și înregistrări

  • Nu puteți referi la un câmp care nu există
  • Nici un camp nu poate fi nul (nedefinit. W) sau includ null
  • Nu puteți crea intrare recursiv, folosind acest lucru sau de sine.

Elm încurajează separarea strictă a datelor și a logicii, precum și capacitatea de a utiliza aceasta. utilizate în principal pentru separarea unor astfel de tulburări. Aceasta este o problemă comună a tuturor limbilor orientate-obiect, care în mod deliberat Elm ocolește.

Intrările sprijină, de asemenea, tipizarea structurale, ceea ce înseamnă că ele pot fi folosite în orice situație, atâta timp cât există câmpul dorit. Acest lucru ne oferă flexibilitate, fără a compromite fiabilitatea.

Import si module

Elm importăm un modul folosind importul de cuvinte cheie:

Așa că am făcut modulul HTML de import din biblioteca standard. După aceea, putem folosi funcțiile și tipurile de acest modul, calea completă:

Putem face, de asemenea, importurile de module și a pus funcțiile și tipurile sale specifice:

div este acum în domeniul de aplicare curent. Prin urmare, putem numi în mod direct:

Putem chiar pune toate conținutul modulului:

Apoi, putem folosi orice tip de funcție și modulul direct. Dar nu este recomandat să facă acest lucru, deoarece acest lucru va duce la ambiguitate și posibilele intersecții dintre module.

Module și tipuri cu același nume

O multitudine de module cu același nume exportat tipuri. De exemplu, modulul HTML conține tip HTML. și un modul de sarcini - Tipul de sarcină.

Prin urmare, această funcție, care returnează elementul HTML:

În primul caz, vom importa doar modul HTML, și de a folosi calea completă Html.Html.

În al doilea rând - vom expune tip html html modulului. și apoi utilizați în mod direct acest tip.

Main - numele modulului. expunerea (..) înseamnă că vrem să pună toate funcțiile și tipurile de acest modul. Elm se așteaptă ca acest fișier Main.elm modul. și anume fișier cu același nume ca și modulul.

Putem avea o structură mai complexă a fișierelor din aplicație. De exemplu, Playere / fișier Utils.elm trebuie să aibă următoarea declarație:

Players.Utils module expuneau (..)

Import acest modul oriunde în aplicație, puteți:

tipul Uniunii

În Elm, tipul Uniunii este folosit pentru multe lucruri din cauza flexibilității lor extremă. Tipul Uniunii este după cum urmează:

Răspunsul poate fi fie Da. sau Nu. Tipuri ale Uniunii sunt utile pentru a aduce codul să însemne mai mult decât o generalizare. De exemplu, o funcție declarată după cum urmează:

Poate dura Da sau Nu ca porului al argumentului, de exemplu, pentru a răspunde Da - apelul corect.

tipuri ale Uniunii sunt, de asemenea, numite tag-uri în Elm.

conținut

Tipuri de date ale Uniunii pot conține în interior:

În acest caz, eticheta va conține un Celălalt anumit șir de caractere. Putem răspunde pentru a apela astfel:

Trebuie să folosiți paranteze, în caz contrar Elm luați ca o funcție de transfer de două argumente răspund.

constructorul

Să luăm în considerare modul în care vom atașa date de Celălalt:

Se pare exact ca un apel Alte funcții. tipuri ale Uniunii se comporte ca funcțiile. De exemplu, tipul:

Putem crea o etichetă mesaj de genul:

Putem folosi aplicarea parțială, precum și cu funcții obișnuite. Funcția obținută De obicei, se numește un constructor, deoarece le putem folosi pentru a construi o copie completă, și anume utilizați mesajul. pentru a obține (Mesaj 1 "Hello").

cuiburi

Foarte frecvente tipuri de cuiburi ale Uniunii:

Apoi, putem apela o funcție răspunde. care asteapta raspuns. ca aceasta:

Puteți utiliza, de asemenea variabile, cum ar fi tipuri în Uniune:

Acest răspuns. care pot conține date de diferite tipuri, de exemplu, Int. String.

De exemplu, funcția răspunde ar putea arăta astfel:

Aici declarăm că un tip ar trebui să fie Int. Utilizarea semnăturii Răspuns Int.

Astfel, putem răspunde pentru a apela după cum urmează:

Dar nu putea apela pentru a răspunde (Altele „Bună ziua“), pentru că răspunde se așteaptă ca un întreg în loc o.

yuzkeys tipice

Un posibil mod de aplicare tipuri de unire - valori de transmisie, care poate să aparțină unui anumit set.

De exemplu, într-o aplicație web tipică, există acțiuni care pot fi efectuate de către o persoană sau de aplicația în sine, de exemplu, încărcarea membrilor, adăugarea unui utilizator, eliminarea unui utilizator, etc. Unele dintre aceste acțiuni pot transporta date.

De obicei, folosite pentru acest tip de sindicat:

Pseudonime tipuri (tip pseudonime)

Ulmul tipuri de alias, după cum sugerează și numele - sunt pseudonime pentru tot felul de lucruri. De exemplu, în limba sunt tipurile Int și String. Putem crea porecle pentru ei:

Așa că am creat o pereche de tipuri de alias-uri care arată doar tipurile de biblioteca standard. Acest lucru este convenabil, deoarece, având o astfel de funcție:

O putem rescrie astfel:

Deci, este mult mai clar ce anume funcționează.

de înregistrare Definiție în Elm arată astfel:

Dacă avem nevoie de o funcție care are un record, vom scrie semnătura ei, după cum urmează:

Destul de tărăgănat, dar alias-uri pot fi utile aici:

Deci, vom crea un jucător alias. care indică determinarea înregistrării, și apoi vom folosi alias în semnătură funcția.

constructorilor

Tipuri de aliasuri pot fi folosite ca un constructor funcții. Ie putem crea o copie a înregistrării, folosind un pseudonim, ca funcție.

Aici am creat un jucător alias. Apoi, noi numim Playerul ca o funcție cu două argumente care ne întoarce la înregistrarea cu atributele corecte. Rețineți că ordinea argumentelor pentru a determina care valori vor avea atribute.

tuplu gol - () - Unitatea numit. El este atât de comun, care merită o explicație.

Luați în considerare tipul de variabilă de tip alias (reprezentant a):

Putem crea o functie care asteapta atributul mesaj de tip corp String ca aceasta:

Sau funcție care se așteaptă un mesaj, al cărui corp - o listă de numere:

Dar ce putem spune despre funcțiile care nu necesită o valoare în organism. Pentru a face acest lucru, vom folosi unitatea, indicând faptul că corpul mesajului (corpul) trebuie să fie gol:

Această funcție are un mesaj cu un corp gol. Nu este nici o valoare, și este gol.

Astfel, tipul de unitate este în general utilizat ca substituent pentru valorile martor.

Studiu de caz - Tipul de sarcină. Când utilizați activități. unitate va întâlni destul de des.

O sarcină tipică (sarcina) conține o eroare și rezultatul:

  • Uneori avem nevoie de o sarcină, o eroare care poate fi ignorată în condiții de siguranță: Sarcină () rezultat
  • Sau ignorat rezultatul: Sarcini de eroare ()
  • Sau o combinație între cele două: Sarcină () ()