La seguente dichiarazione fornisce un errore:
type Vec2d = (Float, Float)
type Vec3d = (Float, Float, Float)
-- Rect x y defines a rectangle spanning from (0,0) to (x,y)
data Obj2d = Rect Float Float
| Translate Vec2d Obj2d
-- Cuboid x y z defines a cuboid spanning from (0,0,0) to (x,y,z)
data Obj3d = Cuboid Float Float Float
| Translate Vec3d Obj3d
vale a dire Multiple declarations of 'Translate'
.
Ora, mi chiedo perché questa limitazione sia stata introdotta?
Se la limitazione non fosse presente, si potrebbe scrivere
Translate (1, 1) Rect 2 2
e
Translate (1, 2, 3) Cuboid 1 1 1
, che suona naturale.
Non vedo (immediatamente) come ciò possa comportare un problema di analisi delle offerte per non consentire l'utilizzo dello stesso nome, il tipo potrebbe essere dedotto dall'argomento ( Rect 2 2
è un Obj2d
, Cuboid 1 1 1
è un Obj3d
).
Sono sicuro che c'è una buona ragione per cui i progettisti del linguaggio hanno scelto di non consentire l'uso dello stesso nome per costruttori di dati di tipi diversi, ma mi piacerebbe imparare: perché, quando ovviamente non è necessario?
(E il tipo di chiarimento è il business del pane e burro di Haskell!)