การประกาศต่อไปนี้ให้ข้อผิดพลาด:
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
คือ an Obj2d
, Cuboid 1 1 1
คือObj3d
)
ฉันแน่ใจว่ามีเหตุผลที่ดีที่นักออกแบบภาษาเลือกที่จะไม่อนุญาตให้ใช้ชื่อเดียวกันกับตัวสร้างข้อมูลประเภทต่าง ๆ แต่ฉันต้องการที่จะเรียนรู้: ทำไมเมื่อไม่จำเป็นอย่างเห็นได้ชัด?
(และประเภทความเข้าใจผิดเป็นธุรกิจขนมปังและเนยของ Haskell!)