Khai báo sau đây có lỗi:
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
cụ thể là Multiple declarations of 'Translate'
.
Bây giờ, tôi tự hỏi tại sao giới hạn này đã được giới thiệu?
Nếu không có giới hạn, người ta có thể viết
Translate (1, 1) Rect 2 2
và
Translate (1, 2, 3) Cuboid 1 1 1
, âm thanh tự nhiên.
Tôi không (ngay lập tức) xem làm thế nào điều này có thể dẫn đến việc đặt giá thầu phân tích vấn đề không cho phép sử dụng cùng tên, loại có thể được suy ra bởi đối số ( Rect 2 2
là một Obj2d
, Cuboid 1 1 1
là một Obj3d
).
Tôi chắc chắn có một lý do chính đáng để các nhà thiết kế ngôn ngữ chọn không cho phép sử dụng cùng tên cho các nhà xây dựng dữ liệu thuộc các loại khác nhau, nhưng tôi muốn tìm hiểu: tại sao, khi nó không thực sự cần thiết?
(Và định hướng loại là kinh doanh bánh mì và bơ của Haskell!)