निम्नलिखित घोषणा एक त्रुटि देती है:
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
)।
मुझे यकीन है कि अलग-अलग प्रकार के डेटा निर्माताओं के लिए समान नाम का उपयोग करने के लिए भाषा डिजाइनरों ने एक अच्छा कारण चुना है, लेकिन मैं सीखना चाहता हूं: क्यों, जब यह स्पष्ट रूप से आवश्यक नहीं है?
(और प्रकार भंगुर हास्केल का ब्रेड-एंड-बटर व्यवसाय है!)