Aşağıdaki bildirim bir hata veriyor:
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
yani Multiple declarations of 'Translate'
.
Şimdi, bu sınırlamanın neden ortaya çıktığını merak ediyorum?
Eğer sınırlama orada olmasaydı,
Translate (1, 1) Rect 2 2
ve
Translate (1, 2, 3) Cuboid 1 1 1
kulağa doğal geliyor.
Ben (hemen) bu nasıl aynı adı kullanarak izin vermemek için bir ayrıştırma sorun teklif ile sonuçlanabilir görmüyorum, türü argüman tarafından çıkarılabilir ( Rect 2 2
bir Obj2d
, bir Cuboid 1 1 1
, bir Obj3d
).
Eminim dil tasarımcıları farklı türdeki veri yapıcıları için aynı adı kullanarak izin vermemeyi tercih etmelerinin iyi bir nedeni var, ama öğrenmek istiyorum: neden, açıkça gerekli olmadığında?
(Ve tür ayrımı Haskell'in ekmek ve tereyağı işidir!)