Track
/
Elm
Elm
/
Esercizi
/
Il negozio di biciclette di Betty
Il negozio di biciclette di Betty

Il negozio di biciclette di Betty

Esercizio di apprendimento

Introduzione

Basi 2

Esportare le funzioni

Abbiamo già parlato dell'esportazione delle funzioni nel primo concetto: ecco un breve ripasso.

Ogni file in Elm è un modulo e deve contenere un'istruzione module prima di ogni altro codice.

I nomi dei moduli devono corrispondere al nome del file: quindi il modulo Calculator deve trovarsi nel file Calculator.elm, e il modulo Parser.Utils deve trovarsi nel file Parser/Utils.elm.

Tutto ciò che viene definito all'interno di un modulo ha uno scope privato e non è accessibile dall'esterno del modulo, a meno che non sia elencato in exposing.

-- 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

Importare funzioni da altri moduli

Per accedere alle funzioni definite in altri moduli si usano le importazioni. Quando importi un modulo, tutte le funzioni che esso espone diventano accessibili. Ma il modo in cui vi si accede dipende da come il modulo viene importato.

Le importazioni qualificate sono quelle predefinite: per accedere a una funzione di un modulo così importato (per esempio la funzione map nel modulo List) si antepone il nome del modulo (List.map).

Le importazioni aperte permettono di accedere direttamente alle funzioni esposte da quel modulo, senza anteporre nulla. Si fanno con la parola chiave exposing, come specchio di quella usata nelle esportazioni. Puoi esporre tutte le funzioni disponibili (con ..), oppure solo alcune (per esempio map).

Puoi anche importare i tipi e i loro costruttori da altri moduli: è un concetto che affronteremo più avanti.

Le importazioni qualificate sono preferibili perché aiutano la chiarezza ed evitano conflitti di nomi.

-- 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

Le annotazioni di tipo

Le annotazioni di tipo si definiscono con name : parameter types -> return type, dove anche i tipi dei parametri sono separati da ->.

add : Int -> Int -> Int
add number1 number2 = number1 + number2

Le parentesi tonde (()) possono essere usate per definire i parametri di una funzione (che a loro volta si definiscono con la stessa sintassi: da qui la necessità delle parentesi).

-- Transform every character in a string
map : (Char -> Char) -> String -> String
map charMapperFunction string =
    -- ...

https://elm-lang.org/docs/syntax#type-annotations

I numeri

In Elm ci sono due tipi di numeri, definiti dai tipi Int e Float. Int corrisponde all'insieme dei numeri interi positivi e negativi. Float corrisponde all'insieme dei numeri reali, limitato dalla precisione del computer. Le operazioni definite sui numeri di solito funzionano su un tipo o sull'altro, ma non mescolandoli. Esistono funzioni per convertire tra i due: toFloat, che converte un Int in un Float, e round, floor, ceiling o truncate, che convertono un Float in un Int con semantiche diverse.

https://package.elm-lang.org/packages/elm/core/latest/Basics#Int

Le operazioni sulle stringhe

Per descrivere parole e frasi nel codice, Elm ha un tipo String nativo. I valori letterali di tipo stringa si scrivono tra virgolette doppie, come "Hello World!". Un operatore di concatenazione di stringhe ++ e un operatore di uguaglianza == sono disponibili per impostazione predefinita.

hello : String -> String
hello subject = "Hello " ++ subject

hello "World!" --> "Hello World!"

La maggior parte delle altre funzioni per le stringhe si trova nel modulo String, che deve essere importato.

https://package.elm-lang.org/packages/elm/core/latest/String

Istruzioni

In questo esercizio scriverai del codice per aiutare Betty's Bike Shop, un negozio online di bici e componenti. Hai tre compiti, che hanno lo scopo di mostrare correttamente i prezzi delle bici e dei componenti sul sito.

1. Esporta la funzione penceToPounds

Un tuo collega ha già scritto lo scheletro del modulo, le funzioni non definite penceToPounds e poundsToString. Tuttavia, si è dimenticato di esportare la funzione penceToPounds, quindi al momento non è visibile dagli altri moduli né dalla suite di test.

Aggiungi penceToPounds all'elenco delle funzioni esportate.

2. Converti i penny in sterline

Al momento il prezzo è memorizzato come numero intero di penny (il negozio di bici ha sede nel Regno Unito). Sul sito vogliamo mostrare il prezzo in sterline, dove 1,00 sterlina equivale a 100 penny. Il secondo compito è implementare la funzione penceToPounds, che prende una quantità di penny come Int e la converte nel suo equivalente in sterline come Float. Dovresti anche definire l'annotazione di tipo di quella funzione.

penceToPounds 106
    --> 1.06

3. Formatta il prezzo da mostrare sul sito

Dato che le bici di Betty si vendono in sterline, i prezzi vanno mostrati con il simbolo «£». Il terzo compito è quindi implementare la funzione poundsToString, che prende una quantità di sterline come Float e restituisce il prezzo mostrato come String, con il simbolo della sterlina anteposto. Il modulo String contiene la funzione String.fromFloat, che sarà utile a questo scopo. Dovresti importare il modulo String prima di usarlo. Dovresti anche definire l'annotazione di tipo di poundsToString.

poundsToString 1.06
    --> "£1.06"
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Elm Exercism

Vuoi iniziare Il negozio di biciclette di Betty?

Iscriviti a Exercism per imparare e padroneggiare Elm con 28 concetti110 esercizi e il mentoring di persone reali, tutto gratis.