I tipi personalizzati in Elm rappresentano un numero fisso di casi denominati. Ogni valore corrisponde esattamente a uno di questi casi.
Un tipo personalizzato si definisce con la parola chiave type e richiede pochissima sintassi. È una delle tecniche più importanti della programmazione in Elm. Serve a far coincidere esattamente i valori possibili nel codice con i valori validi nella realtà: così non c'è spazio per dati non validi e diventa impossibile rappresentare nel codice stati impossibili.
type Season
= Spring
| Summer
| Autumn
| Winter
Ogni caso di un tipo personalizzato può avere dei dati associati, e casi diversi possono avere tipi di dati diversi. Se nessuno dei casi ha dati associati, l'unione discriminata è simile a quella che in altri linguaggi si chiama di solito enumerazione (o enum).
type FlexibleNumber
= Integer Int
| Float Float
| Invalid
Per creare un valore di un caso specifico puoi riferirti al suo nome (Spring) quando il tipo è definito nello stesso modulo, oppure quando è importato con la sintassi import SeasonModule exposing (Season(..)). In alternativa puoi usare il nome completo (Season.Spring) quando il tipo è importato con la sintassi import SeasonModule exposing (Season).
integerTwo = Integer 2
invalid = FlexibleNumber.Invalid
I tipi personalizzati, come tutto in Elm, hanno l'uguaglianza strutturale: due valori dello stesso caso con gli stessi dati (opzionali) sono equivalenti.
Il modo preferito per lavorare con i tipi personalizzati è il pattern matching:
let describe flexibleNumber =
case flexibleNumber of
Integer i ->
"Integer: " ++ fromInt(i)
Float f ->
"Float: " ++ fromFloat(f)
Invalid ->
"Invalid"
In questo esercizio è San Valentino: tu ed il tuo partner state pensando di fare qualcosa di bello insieme. Il tuo partner ha un sacco di idee: adesso ti chiede di valutarle, per trovare l'attività a cui dedicarsi.
Il tuo partner propone le seguenti idee:
Avrai sei compiti che ti aiuteranno a scegliere l'attività per San Valentino.
Per ogni idea che il tuo partner propone, rispondi con una delle tre opzioni: sì, no o forse.
Definisci il Custom Type Approval per rappresentare queste opzioni con i seguenti tre casi: Yes, No e Maybe.
Il tuo partner ha selezionato due possibili ristoranti: uno di cucina coreana e l'altro di cucina turca.
Definisci il Custom Type Cuisine per rappresentare queste cucine con i seguenti due casi: Korean e Turkish.
Ci sono tantissimi film tra cui scegliere, quindi per restringere il campo il tuo partner ne indica anche il genere.
Definisci il Custom Type Genre per rappresentare i seguenti generi come casi: Crime, Horror, Romance e Thriller.
Come detto, il tuo partner ha ideato cinque attività diverse: giocare ad un gioco da tavolo, rilassarsi, guardare un film ed andare al ristorante.
Definisci il Custom Type Activity per rappresentare questi tipi di attività:
BoardGame: nessun dato associato.Chill: nessun dato associato.Movie: ha il suo Genre come dato associato.Restaurant: ha la sua Cuisine come dato associato.Finalmente, sei pronto a valutare le idee del tuo partner. Ecco cosa ne pensi:
Implementa una funzione chiamata rateActivity che prende un valore Activity e restituisce l'Approval in base alle preferenze descritte sopra:
rateActivity (Restaurant Turkish)
-- => Maybe
Iscriviti a Exercism per imparare e padroneggiare Elm con 28 concetti110 esercizi e il mentoring di persone reali, tutto gratis.