Track
/
F#
F#
/
Esercizi
/
San Valentino
San Valentino

San Valentino

Esercizio di apprendimento

Introduzione

Unioni discriminate

Il tipo unione discriminata rappresenta un numero fisso di casi denominati. Ogni valore di un'unione discriminata corrisponde esattamente a uno dei casi denominati.

Un'unione discriminata si definisce con la parola chiave type, con i casi separati dal carattere pipe (|):

type Season =
    | Spring
    | Summer
    | Autumn
    | Winter

Ogni caso di un'unione discriminata può avere facoltativamente dei dati associati, e casi diversi possono avere tipi di dati diversi. Se nessuno dei casi ha dei dati associati, l'unione discriminata è simile a quello che in altri linguaggi viene di solito chiamato enumerazione (o enum).

type Number =
    | Integer of int
    | Float of float
    | Invalid

Per creare un valore per un caso specifico basta riferirsi al suo nome (ad es. Success). Dato che i nomi dei casi sono soltanto funzioni costruttore, i dati associati possono essere passati come un normale argomento di una funzione. Se un'altra unione discriminata ha definito un caso con lo stesso nome, dovrai usare il nome completo (ad es. Result.Success).

let byName = Integer 2
let byFullName = Number.Invalid

Le unioni discriminate hanno l'uguaglianza strutturale, il che significa che due valori dello stesso caso e con gli stessi dati (facoltativi) sono equivalenti.

Anche se è possibile usare espressioni if/elif/else per lavorare con le unioni discriminate, il modo consigliato per farlo è tramite i criteri di ricerca, usando il criterio identificatore:

let describe number =
    match number with
    | Integer i -> sprintf "Integer: %d" i
    | Float d  -> sprintf "Float: %f" d
    | Invalid   -> "Invalid"

Istruzioni

In questo esercizio è San Valentino e tu e il tuo partner state pianificando di fare qualcosa di bello insieme. Il tuo partner ha un sacco di idee e ora ti chiede di valutarle, per trovare l'attività da fare.

Il tuo partner 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 proposta dal tuo partner, rispondi con una delle tre opzioni: yes, no o maybe.

Definisci l'unione discriminata Approval per rappresentare queste opzioni con i tre casi seguenti: Yes, No e Maybe.

2. Definisci le cucine

Il tuo partner ha selezionato due possibili ristoranti: uno di cucina coreana e l'altro di cucina turca.

Definisci l'unione discriminata Cuisine per rappresentare queste cucine con i due casi seguenti: Korean e Turkish.

3. Definisci i generi cinematografici

Ci sono tantissimi film tra cui scegliere, quindi per restringere il campo il tuo partner ne indica anche il genere.

Definisci l'unione discriminata Genre per rappresentare i generi seguenti come casi: Crime, Horror, Romance e Thriller.

4. Definisci l'attività

Come dicevamo, il tuo partner ha pensato a cinque attività diverse: giocare a un gioco da tavolo, rilassarsi, guardare un film, andare al ristorante e fare una passeggiata.

Definisci l'unione discriminata 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à

Ora sei pronto a valutare le idee del tuo partner. Ecco come la pensi sulle sue idee:

  • 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 la passeggiata è meno di tre chilometri, maybe se è meno di cinque chilometri, altrimenti no.

Implementa una funzione chiamata rateActivity che prende un valore Activity e restituisce l'Approval in base a quanto detto sopra:

rateActivity (Restaurant Turkish)
// => Maybe
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
F# Exercism

Vuoi iniziare San Valentino?

Iscriviti a Exercism per imparare e padroneggiare F# con 18 concetti148 esercizi e il mentoring di persone reali, tutto gratis.