Track
/
Haskell
Haskell
/
Esercizi
/
San Valentino
San Valentino

San Valentino

Esercizio di apprendimento

Introduzione

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"

Istruzioni

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:

  • Giocare a un gioco da tavolo
  • Rilassarsi
  • Guardare un film
  • Andare al ristorante
  • Fare una passeggiata

Hai sei compiti che ti aiuteranno a scegliere l'attività per San Valentino.

1. Definisci l'approvazione

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.

2. Definisci le cucine

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.

3. Definisci i generi dei film

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.

4. Definisci l'attività

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.

5. Valuta l'attività

Infine, sei pronto a valutare le idee del tuo partner. Ecco cosa pensi delle idee del tuo partner:

  • Giocare a un gioco da tavolo: no.
  • Rilassarsi: no.
  • Guardare un film: yes se è un film romantico, altrimenti no.
  • Andare al ristorante: yes se la cucina è coreana, maybe se è turca.
  • Fare una passeggiata: yes se è meno di tre chilometri, maybe se è tra i tre e i cinque chilometri (estremi inclusi), altrimenti no.

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
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Haskell Exercism

Vuoi iniziare San Valentino?

Iscriviti a Exercism per imparare e padroneggiare Haskell con 107 esercizi e il mentoring di persone reali, tutto gratis.