विभिन्न प्रकार के कंस्ट्रक्टर्स में एक ही नाम वाले डेटा कंस्ट्रक्टर्स को क्यों अस्वीकृत किया गया है?


11

निम्नलिखित घोषणा एक त्रुटि देती है:

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)।

मुझे यकीन है कि अलग-अलग प्रकार के डेटा निर्माताओं के लिए समान नाम का उपयोग करने के लिए भाषा डिजाइनरों ने एक अच्छा कारण चुना है, लेकिन मैं सीखना चाहता हूं: क्यों, जब यह स्पष्ट रूप से आवश्यक नहीं है?

(और प्रकार भंगुर हास्केल का ब्रेड-एंड-बटर व्यवसाय है!)


3
तर्क से टाइप किए जा रहे प्रकार के बारे में: क्या आप जानते हैं कि कभी-कभी तर्क प्रकार के फ़ंक्शन से प्रभावित होते हैं ?

@delnan मुझे उस बारे में पता नहीं था ... मेरे लिए एक जवाब की तरह लगता है। मुझे लगा कि हमेशा निष्कर्ष नीचे था, हालांकि मैं एक ग्राफ कारक के रूप में दूसरी तरफ से टाइप जानकारी का उपयोग करके अस्पष्टता रिज़ॉल्यूशन देख सकता था, जैसा कि आप एक निर्णायक कारक के रूप में वर्णित करते हैं ... इसके लिए मेरी मानसिक छवि नीचे प्रकार पर लौटी है ग्राफ और फ़ंक्शन शीर्ष पर कॉल करते हैं, रिज़ॉल्यूशन एक एग्रीगेट होता है जो नीचे से ऊपर की ओर होता है, लेकिन यह पूरी तस्वीर नहीं है, आप क्या कह रहे हैं? आश्चर्य की बात नहीं, एक सही प्रकार की हीनता के साथ भरोसेमंद रूप से टाइप की गई भाषा में यह शायद अधिक सटीक है ..
जिमी हॉफ

जवाबों:


13

ऐसा इसलिए है क्योंकि डेटा कंस्ट्रक्टर सिर्फ फ़ंक्शन हैं, और हास्केल में फ़ंक्शन ओवरलोडिंग की अनुमति नहीं है। यदि आप अपने प्रकारों को परिभाषित करने के लिए GADT सिंटैक्स का उपयोग करते हैं तो यह अधिक स्पष्ट हो सकता है:

{-# LANGUAGE GADTs #-}
data Obj2d where
    Rect :: Float -> Float -> Obj2d   -- a function from floats to obj2d's
    Translate :: Vec2d -> Obj2d       -- a function from vec2d's to Obj2d's

मेरा मानना ​​है कि वे (जीएचसी देव) इस समस्या के संभावित समाधानों पर काम कर रहे हैं, जिसमें type classसभी प्रकार के लिए एक नया परिचय देना शामिल है जो एक ही डेटा कंस्ट्रक्टर, या कुछ समान साझा करते हैं। तो देखते रहिए, जल्द ही आपकी समस्या का समाधान हो सकता है! (मुझे उम्मीद है)


मैं निश्चित रूप से इन type classनिर्माणों का इंतजार कर रहा हूं जो आप कर रहे हैं। - कारण यह है: मुझे कोई समस्या नहीं है, मैं कर सकता हूं Translate2और Translate3d, लेकिन मैं नाम स्थान को प्रदूषित नहीं करूंगा।
एक एसयू

मैं जीएचसी देव नहीं हूं, इसलिए यह सिर्फ सुनना-कहना है। मुझे उम्मीद है कि ऐसा होता भी है।
बस्तमौर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.