A függvények exportálásáról már az első fogalomban szó volt, itt egy gyors ismétlés következik.
Az Elmben minden fájl egy modul, és minden más kód előtt szerepelnie kell benne egy module utasításnak.
A modulneveknek meg kell egyezniük a fájlnevekkel, tehát a Calculator modulnak a Calculator.elm fájlban kell lennie, a Parser.Utils modulnak pedig a Parser/Utils.elm fájlban.
Minden, ami egy modulon belül van definiálva, csak azon a modulon belül érhető el, és kívülről nem lehet hozzáférni, hacsak nem szerepel az exposing-ban.
-- Calculator.elm
-- Define the Calculator module, and expose the `add` function
module Calculator exposing (add)
six = 3 + 3
add number1 number2 = number1 + number2
-- Calculator.elm
-- Define the Calculator module, and expose everything within: `six` and `add`
module Calculator exposing (..)
six = 3 + 3
add number1 number2 = number1 + number2
https://elm-lang.org/docs/syntax#modules
A más modulokban definiált függvényeket importokon keresztül éred el. Amikor importálsz egy modult, minden olyan függvény elérhetővé válik, amelyet az a modul közzétett. Az viszont, hogy hogyan éred el őket, attól függ, hogyan importáltad a modult.
Alapértelmezésben a minősített importot használjuk, és egy ilyen modulban lévő függvényt (például a map függvényt a List modulban) úgy érünk el, hogy a modul nevét írjuk elé (List.map).
A nyílt importok közvetlen hozzáférést adnak az adott modulban közzétett függvényekhez, előtag nélkül. Az exposing kulcsszóval valósulnak meg, mintegy tükörképeként az exportnál használtnak. Közzétehetsz minden elérhető függvényt (a .. használatával), vagy csak bizonyosakat (például a map-et).
Más modulokból típusokat és azok konstruktorait is importálhatod, de ez egy későbbi fogalom.
A minősített importot részesítjük előnyben, mert átláthatóbb, és segít elkerülni a névütközéseket.
-- qualified imports
import List -- List.map, List.foldl
import List as L -- L.map, L.foldl
-- open imports
import List exposing (..) -- map, foldl, concat, ...
import List exposing ( map, foldl ) -- map, foldl, List.concat
https://elm-lang.org/docs/syntax#modules
A típusannotációkat a name : parameter types -> return type formában adjuk meg, a paramétertípusokat szintén -> választja el egymástól.
add : Int -> Int -> Int
add number1 number2 = number1 + number2
Zárójelekkel függvényparamétereket definiálhatunk (amelyek maguk is ugyanezzel a szintaxissal vannak megadva, innen a zárójelek szükségessége).
-- Transform every character in a string
map : (Char -> Char) -> String -> String
map charMapperFunction string =
-- ...
https://elm-lang.org/docs/syntax#type-annotations
Az Elmben kétféle szám létezik, amelyeket az Int és a Float típus definiál.
Az Int a pozitív és negatív egész számok halmazának felel meg.
A Float a valós számok halmazának felel meg, a számítógép pontossága által korlátozva.
A számokon definiált műveletek általában az egyik vagy a másik típuson működnek, de nem keverik őket.
Léteznek függvények a kettő közötti átalakításra, mint például a toFloat, amely Int-et alakít Float-tá, valamint a round, floor, ceiling és truncate, amelyek egy Float-ot alakítanak Int-té, különböző szemantikával.
https://package.elm-lang.org/packages/elm/core/latest/Basics#Int
Szavak és mondatok leírására az Elmben van egy natív String típus.
A stringliterálokat idézőjelek közé írjuk, például "Hello World!".
A stringösszefűző ++ operátor és az egyenlőségvizsgáló == operátor alapértelmezésben elérhető.
hello : String -> String
hello subject = "Hello " ++ subject
hello "World!" --> "Hello World!"
A legtöbb egyéb stringfüggvény a String modulban van, amelyet importálni kell.
https://package.elm-lang.org/packages/elm/core/latest/String
Ebben a feladatban kódot írsz, hogy segíts Betty's Bike Shopnak, egy online bicikli- és alkatrészboltnak. Három részfeladat vár rád, amelyek célja, hogy helyesen jelenítsd meg a biciklik és alkatrészek árait a weboldalon.
penceToPounds függvénytA kollégád már megírta a modul vázát, a még nem definiált penceToPounds és poundsToString függvénnyel.
Ő azonban elfelejtette exportálni a penceToPounds függvényt, így az jelenleg sem más modulok, sem a tesztek számára nem látható.
Vedd fel a penceToPounds függvényt az exportált függvények listájára.
Az árat jelenleg egész számként, pennyben tároljuk (a biciklibolt az Egyesült Királyságban működik).
A weboldalon az árat fontban szeretnénk megjeleníteni, ahol 1,00 font 100 pennynek felel meg.
A második részfeladatod, hogy valósítsd meg a penceToPounds függvényt, amely egy Int típusú pennyösszeget kap, és átváltja a neki megfelelő fontértékre Float típusként.
A függvény típusannotációját is definiálnod kell.
penceToPounds 106
--> 1.06
Mivel Betty biciklijeit fontban árulják, az árakat a „£” szimbólummal kell megjeleníteni.
A harmadik részfeladatod tehát, hogy valósítsd meg a poundsToString függvényt, amely egy Float típusú fontösszeget kap, és visszaadja az árát Stringként, a font szimbólummal az elején.
A String modul tartalmazza a String.fromFloat függvényt, amely hasznos lesz ehhez.
Mielőtt használod, importálnod kell a String modult.
A poundsToString típusannotációját is definiálnod kell.
poundsToString 1.06
--> "£1.06"
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Elm nyelvet 28 fogalom110 feladat segítségével, valódi emberi mentorálással, mindez ingyen.