Sembra che il codice F # spesso disegni le corrispondenze con i tipi. Certamente
match opt with
| Some val -> Something(val)
| None -> Different()
sembra comune.
Ma da una prospettiva OOP, sembra molto simile al flusso di controllo basato su un controllo di tipo runtime, che in genere sarebbe disapprovato. Per scriverlo, in OOP probabilmente preferiresti usare l'overloading:
type T =
abstract member Route : unit -> unit
type Foo() =
interface T with
member this.Route() = printfn "Go left"
type Bar() =
interface T with
member this.Route() = printfn "Go right"
Questo è sicuramente più codice. OTOH, sembra che la mia mente OOP-y abbia vantaggi strutturali:
- l'estensione a una nuova forma di
T
è facile; - Non devo preoccuparmi di trovare la duplicazione del percorso, scegliendo il flusso di controllo; e
- la scelta dell'itinerario è immutabile nel senso che una volta che ho una
Foo
in mano, non devo preoccuparmi dell'implementazione diBar.Route()
Ci sono vantaggi rispetto alla corrispondenza del modello rispetto ai tipi che non vedo? È considerato idiomatico o è una capacità che non è comunemente usata?