Quando pensavo al design del linguaggio mi sono reso conto che gli ADT (tipi di dati di Aglebraic) e le classificazioni potrebbero essere la stessa cosa. Possono entrambi rappresentare un gruppo di tipi, ma in haskell non sono la stessa cosa. Typeclass può essere esteso in seguito, ma ADT non può.
Ma a volte anche la classe di tipizzazione non può fare tutto ciò che un ADT può fare. Ad esempio:
class Shape a where
draw :: a -> IO ()
data Rectangle = Rectangle Float Float
instance Shape Rectangle where
draw rectangle = ...
-- no way to put constraint for shape
data Group a = Group [a]
instance Shape Group wheres
draw group = ...
Con ADT è semplice e funzionante, ma non è possibile aggiungere nuove forme:
data Shape
= Rectangle Float Float
| Group [Shape]
draw (Rectangle x y) = ...
draw (Group [ss]) = ...
Se le classi fossero più simili agli ADT, la lingua potrebbe comportarsi in modo simile quando si tratta di booleani (questa non è la sintassi di un vero programma):
-- a group of types
class Bool
-- one type with one constructor
data True
-- adding type to group
instance Bool True
data False
instance Bool False
Questo potrebbe anche essere fatto con i numeri, che sembrerebbero ancora più ridicoli, ma spero che tu possa ottenere il mio punto.
È possibile che in altre lingue queste due cose siano una? Qualunque altra lingua funziona in questo modo? Quali sono le ragioni per cui ADT e typeclass devono essere separati?