utilizzare i record (tipi di chiamata di prodotto in teoria programmazione funzionale) per i dati complessi, che viene descritto da diverse proprietà, come un record di database o di qualche modello di entità:
type User = { Username : string; IsActive : bool }
type Body = {
Position : Vector2<double<m>>
Mass : double<kg>
Velocity : Vector2<double<m/s>>
}
Usa discriminato sindacati (chiamati tipi somma) per dati possibili valori per i quali possono essere elencati. Ad esempio:
type NatNumber =
| One
| Two
| Three
...
type UserStatus =
| Inactive
| Active
| Disabled
type OperationResult<'T> =
| Success of 'T
| Failure of string
noti che i valori possibili per un valore un'unione discriminata sono mutuamente esclusivi - un risultato per un'operazione può essere Success
o un Failure
, ma non entrambi allo stesso tempo.
è possibile utilizzare un tipo di record per codificare un risultato di un'operazione, in questo modo:
type OperationResult<'T> = {
HasSucceeded : bool
ResultValue : 'T
ErrorMessage : string
}
Ma in caso di fallimento dell'operazione, è ResultValue
non ha senso. Così, pattern matching su una versione un'unione discriminata di questo tipo sarebbe simile a questa:
match result with
| Success resultValue -> ...
| Failure errorMessage -> ...
E se modello corrisponde alla versione tipo di record del nostro tipo di operazione renderebbe meno senso:
match result with
| { HasSucceeded = true; ResultValue = resultValue; ErrorMessage = _ } -> ...
| { HasSucceeded = false; ErrorMessage = errorMessage; ResultValue = _ } -> ...
Sembra prolisso e goffo, ed è probabilmente meno efficiente. Penso che quando senti una sensazione del genere è probabile che tu stia usando uno strumento sbagliato per il compito.
Questa pagina ha un breve paragrafo http://msdn.microsoft.com/en-us/library/dd233205.aspx alla fine. –