Ho fatto un po 'di programmazione OCaml ultimamente per imparare la lingua e per avere più familiarità con la programmazione funzionale. Recentemente, ho iniziato a pensare che mi piacerebbe essere in grado di estendere un tipo esistente (sia costruito in-o uno dei miei), per esempio:Estensione di un tipo esistente in OCaml
type bexp =
And of bexp * bexp
| Or of bexp * bexp
| Xor of bexp * bexp
| Not of bexp;;
Ora diciamo che voglio aggiungere una variante Nop per questo tipo, ma solo per l'uso in un nuovo tipo - tipo di ereditarietà. Ehi, questi dovrebbero essere tipi di dati algebrici, giusto? Allora perché non qualcosa di simile:
type nbexp = bexp | Nop nbexp ;;
... ma questo non è valido OCaml, dà un errore di sintassi. Fondamentalmente, quello che sto cercando di fare è dire che voglio che nbexp includa tutto ciò che include bexp e aggiunga anche un Nop. Suppongo che questo non sia possibile perché, se per esempio hai usato il costruttore And non ci sarebbe stato modo di determinare se fosse un tipo bexp o un tipo nbexp. (Credo che il costruttore Nop prendendo una nbexp può anche essere problematico.)
Quindi non v'è alcun modo per fare qualcosa di simile in OCaml? E questo è il genere di cosa che è fattibile in Haskell (con i typeclass, forse)?
Forse di interesse: https://sites.google.com/site/ocamlopen/ –