Deklarasi berikut memberikan kesalahan:
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
yaitu Multiple declarations of 'Translate'
.
Sekarang, saya bertanya-tanya mengapa batasan ini diperkenalkan?
Jika batasan itu tidak ada, orang bisa menulis
Translate (1, 1) Rect 2 2
dan
Translate (1, 2, 3) Cuboid 1 1 1
, yang terdengar alami.
Saya tidak (segera) melihat bagaimana hal ini dapat mengakibatkan masalah penguraian penawaran untuk melarang menggunakan nama yang sama, jenisnya dapat disimpulkan oleh argumen ( Rect 2 2
adalah Obj2d
,, Cuboid 1 1 1
adalah Obj3d
)).
Saya yakin ada alasan bagus mengapa perancang bahasa memilih untuk melarang menggunakan nama yang sama untuk konstruktor data dari berbagai jenis, tetapi saya ingin belajar: mengapa, ketika itu jelas tidak diperlukan?
(Dan jenis disambiguasi adalah bisnis roti dan mentega dari Haskell!)