Le unioni discriminate F # corrispondono a gerarchie di classi OO abbastanza da vicino, quindi questa è probabilmente l'opzione migliore. La differenza più importante è che non è possibile aggiungere nuovi casi a un'unione discriminata senza modificare la dichiarazione del tipo. D'altra parte, puoi facilmente aggiungere nuove funzioni che funzionano con il tipo (che corrisponde approssimativamente all'aggiunta di nuovi metodi virtuali in C#).
Quindi, se non si prevede di aggiungere nuove classi ereditate (casi), questa è l'opzione migliore. Altrimenti, è possibile utilizzare i tipi di oggetto F # (o altre opzioni, a seconda dello scenario).
Un altro punto per quanto riguarda il codice: poiché non è possibile aggiungere nuovi casi, il compilatore F # sa che gli unici casi necessari sono per B
e C
. Di conseguenza, il block_3
non può mai essere eseguito, il che significa che è possibile scrivere semplicemente:
let my_fct x =
match x with
| B -> (block_1)
| C -> (block_2)
fonte
2011-09-07 12:44:01
Immagino sia tutto ok. Tranne che ti stai perdendo; dopo block_1, block_2 e block_3 –
Scusa la mia ignoranza, ma sembra che 'block_3' non possa mai essere eseguito nello snippet F # (i tipi di dati algebrici sono" chiusi "per quanto ne so), quindi perché è lì? Inoltre, sono l'unico a pensare che la traduzione dovrebbe usare il polimorfismo? – delnan
Hai assolutamente ragione su block_3. – Hugo