La seguente dichiarazione dà 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
ovvero Multiple declarations of 'Translate'
.
Ora, mi chiedo perché questa limitazione è 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 sembra naturale.
Non vedo (immediatamente) come questo potrebbe portare a un problema di analisi che non consente di utilizzare lo stesso nome, il tipo potrebbe essere desunto dall'argomento ( Rect 2 2
è un Obj2d
, Cuboid 1 1 1
è un Obj3d
).
Sono certo che ci sia un buon motivo per cui i progettisti linguistici hanno scelto di non utilizzare lo stesso nome per costruttori di dati di tipi diversi, ma mi piacerebbe imparare: perché, quando non è ovviamente necessario?
(E digita disambiguazione è il business del pane e burro di Haskell!)