Un tipo di dati algebrico (ADT) rappresenta un numero fisso di casi denominati. Ogni valore di un ADT corrisponde esattamente a uno dei casi denominati.
Un ADT si definisce usando la parola chiave data, con i casi separati dal carattere pipe (|).
Se nessuno dei casi ha dati associati, l'ADT è simile a quello che in altri linguaggi viene di solito chiamato enumerazione (o enum).
data Season
= Spring
| Summer
| Autumn
| Winter
Ogni caso di un ADT può avere facoltativamente dei dati associati, e casi diversi possono avere tipi di dati diversi. Quando un caso ha dati associati, è necessario un costruttore.
data Number
= NInt Int --'NInt' is the constructor for an Int Number.
| NFloat Float --'NFloat' is the constructor for an Float Number.
| Invalid --'Invalid' does not have data associated to it.
Per creare un valore per un caso specifico, si può fare riferimento al suo nome (ad esempio, NInt 22).
Dato che i nomi dei casi sono semplicemente funzioni costruttore, i dati associati possono essere passati come un normale argomento di funzione.
Gli ADT hanno uguaglianza strutturale, il che significa che due valori per lo stesso caso e con gli stessi dati (opzionali) sono equivalenti.
Sebbene si possano usare espressioni if/else per lavorare con gli ADT, il modo consigliato per farlo è tramite il pattern matching usando l'istruzione case:
add1 :: Number -> String
add1 number =
case number of
NInt i -> show (i + 1)
NFloat f -> show (f + 1.0)
Invalid -> error "Invalid input"
In questo esercizio è San Valentino e stai pianificando cosa fare con il tuo partner. Il tuo partner ha un sacco di idee e ti chiede di valutarle per trovare l'attività migliore.
Il tuo partner ti propone le seguenti idee:
Hai 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: yes, no o maybe.
Definisci il tipo di dato algebrico Approval per rappresentare queste opzioni nei tre casi seguenti: Yes, No o Maybe.
Il tuo partner ha selezionato due possibili ristoranti: uno di cucina coreana e l'altro di cucina turca.
Definisci il tipo di dato algebrico Cuisine per rappresentare questi ristoranti nei due casi seguenti: Korean o Turkish.
Ci sono tantissimi film tra cui scegliere, quindi, per restringere il campo, il tuo partner elenca anche il suo genere preferito.
Definisci il tipo di dato algebrico Genre per rappresentare i seguenti casi di genere: Crime, Horror, Romance o Thriller.
Come accennato, il tuo partner ha pensato a cinque possibili attività: giocare a un gioco da tavolo, rilassarsi, guardare un film, andare al ristorante e fare una passeggiata.
Definisci il tipo di dato algebrico 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.Walk: ha un Int che rappresenta il numero di chilometri da percorrere come dato associato.Infine, sei pronto a valutare le idee del tuo partner. Ecco cosa pensi delle idee del tuo partner:
Implementa una funzione chiamata rateActivity che prende un valore Activity e restituisce un Approval in base alle preferenze descritte sopra.
Per esempio:
rateActivity (Restaurant Turkish)
-- -> Maybe
Iscriviti a Exercism per imparare e padroneggiare Haskell con 107 esercizi e il mentoring di persone reali, tutto gratis.