Ogni tanto ho raggiunto il picco di Haskell Tutorials e ho trovato i tipi di dati Algebraic piuttosto interessanti. Ho preso lo scopo di rappresentare i tipi che hanno stati completamente separabili. Purtroppo non ho mai scritto più Haskell di progetti a livello di tutorial, quindi non ho mai dovuto progettare programmi usando questo pattern.
Ora sto scrivendo un po 'di ruggine e ho dei tipi di dati algebrici (enumerati) nella casella degli strumenti. Tuttavia, non sono molto fiducioso nel usarli.
Vorrei iniziare con un esempio in cui sono fiducioso che tale enum è una scelta appropriata.
enum Tree {
Leaf(i: String),
Branch(Tree, Tree)
}
Lo stesso esempio sarebbe applicaple per una struttura simile a XML, ecc.
Con altri dati, non sono così sicuro di usare i tipi di enumerazione. Prendiamo un oggetto di connessione
enum Connection {
UnConnected(...),
ConnectedConnection(....)
}
Qui avremmo un tipo di connessione con due valori possibili, uno che rappresenta lo stato in cui una connessione non è ancora stata stabilita, l'altro potrebbe rappresentare lo stato di una connessione connessa (e avvolgere un handle di connessione per esempio).
L'altra possibilità sarebbe quella di introdurre 2 tipi per un modello di connessione e una connessione connessa.
Un altro esempio che ho trovato nel codice ruggine è quello nella libreria hyper
. Esiste il tipo Response
che rappresenta una risposta HTTP. È un tipo generico.
Response<Fresh>
rappresenta lo stato in cui le intestazioni non sono ancora state congelate. Una volta che è mappato su un Response<Streaming>
, che può essere utilizzato per scrivere il corpo della risposta. Sembra che i modelli Hyper qui con tipi diversi ( Response<Fresh>
vs Response<Streaming>
) avrebbero potuto essere modellati anche con enum
.
L'approccio con tipi diversi consente maggiore sicurezza, Response<Fresh>
non implementa lo streaming (credo) e Response<Streamimg>
lo fa.
Conosci le linee guida e le best practice che guidano correttamente la logica di modellazione nei tipi?