Наступна декларація дає помилку:
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
а саме Multiple declarations of 'Translate'
.
Тепер мені цікаво, чому це обмеження було введено?
Якби обмеження не було, можна було б написати
Translate (1, 1) Rect 2 2
і
Translate (1, 2, 3) Cuboid 1 1 1
, що звучить природно.
Я не (відразу) бачу, як це може призвести до розбору проблеми розбору пропозицій заборонити використання того ж імені, тип може бути зроблений аргументом ( Rect 2 2
є Obj2d
, Cuboid 1 1 1
є Obj3d
).
Я впевнений, що є вагомі причини, що мовні дизайнери вирішили заборонити використовувати одне і те ж ім’я для конструкторів даних різних типів, але я хотів би дізнатися: чому, коли це очевидно не потрібно?
(А розмиття типу - це хлібо-масляний бізнес Haskell!)