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"
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:
Hai sei compiti che ti aiuteranno a scegliere l'attività per San Valentino.
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.
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.
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.
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.Ora sei pronto a valutare le idee del tuo partner. Ecco come la pensi sulle sue idee:
Implementa una funzione chiamata rateActivity che prende un valore Activity e restituisce l'Approval in base a quanto detto sopra:
rateActivity (Restaurant Turkish)
// => Maybe
Iscriviti a Exercism per imparare e padroneggiare F# con 18 concetti148 esercizi e il mentoring di persone reali, tutto gratis.