La siguiente declaración da un error:
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
a saber Multiple declarations of 'Translate'.
Ahora, me pregunto por qué se introdujo esta limitación.
Si la limitación no estuviera allí, uno podría escribir
Translate (1, 1) Rect 2 2
y
Translate (1, 2, 3) Cuboid 1 1 1, lo que suena natural.
No veo (de inmediato) cómo esto podría resultar en un problema de análisis al intentar no usar el mismo nombre, el argumento podría inferir el tipo ( Rect 2 2es un Obj2d, Cuboid 1 1 1es un Obj3d).
Estoy seguro de que hay una buena razón por la que los diseñadores de idiomas decidieron no usar el mismo nombre para constructores de datos de diferentes tipos, pero me gustaría aprender: ¿por qué, cuando obviamente no es necesario?
(¡Y la desambiguación de tipos es el negocio de pan y mantequilla de Haskell!)