2015-09-02 4 views
15

मैं नोटिस कि इन दो परिभाषा नहीं जहां हास्केल प्रलेखन के सबसे आधिकारिक संसाधन में पाया जा सकता है:`(:) 'अंतर्निहित क्यों है?

(:) :: a -> [a] -> [a] 
data [] a = [] | a : [] 

मैं Hoogle की जाँच की और वहाँ data [] या (:) के लिए कोई प्रविष्टि नहीं कर रहे हैं। क्या इन दोनों को "सामान्य" फ़ंक्शन और डेटा प्रकार नहीं माना जाता है?


संपादित: Haskell 2010 Language Report में, वे कहते हैं कि

-- The (:) operator is built-in syntax, and cannot legally be given 
-- a fixity declaration; but its fixity is given by: 
-- infixr 5 : 

लेकिन क्यों? क्या इस समारोह को अलग करने का कोई विशेष कारण है?

उत्तर

16

यह, निर्मित वाक्य रचना नहीं वास्तव में एक अंतर्निहित समारोह। फ़ंक्शन (:) बिल्ट-इन प्रकार [] के दो रचनाकारों में से एक है। हालांकि:

  • प्रकार का नाम, [], किसी प्रकार के नाम के लिए वैध हास्केल वाक्यविन्यास मान्य नहीं है; इसलिए यह अंतर्निहित वाक्यविन्यास होना चाहिए।
  • इसी प्रकार, [] के तत्काल के लिए टाइप सिंटैक्स [a] अंतर्निहित वाक्यविन्यास है।
  • अन्य निर्माता का नाम, [], एक निर्माता नाम के लिए वैध हास्केल वाक्यविन्यास नहीं है; इसलिए यह अंतर्निहित वाक्यविन्यास होना चाहिए।
  • सूची शाब्दिक वाक्यविन्यास [ x, y, z ] अंतर्निहित वाक्यविन्यास (स्पष्ट रूप से) है।

के बाद से अनिवार्य रूप से प्रकार के बारे में सब कुछ [] निर्मित वाक्य रचना है, निर्णय करने के लिए बनाया गया था : निर्मित वाक्य रचना के साथ-साथ, बल्कि यह एक अपवाद है कि वास्तव में में कोई मान्य नाम था की तुलना में भाषा।

+1

अजीब निर्णय, कि। – dfeuer

3

(:) एक सामान्य कार्य नहीं है, लेकिन (मान्य नहीं Haskell 98) परिभाषा आप पोस्ट में दो डेटा कंस्ट्रक्टर्स में से एक है (संपादित मुझे लगता है कि विवाद-योग्य है, क्योंकि इस परिभाषा नहीं असली वाक्य रचना वैसे भी है ...)

data [] a = [] | a : [] 

लेकिन यह वास्तव में आप किस प्रकार (:) :: a -> [a] -> [a]

तैनात है सूचियों की परिभाषा से ऊपर नहीं है मान्य Haskell-98 एक क्योंकि गैर अक्षरांकीय वर्णों शर्तों इन्फ़िक्स कार्यों को निरूपित, तो [] नहीं किया जा सकता निरंतर दा टा कन्स्ट्रक्टर।

दूसरा, बहस करने योग्य कारण (:) के साथ करना है। हैकेल 98 में हम इंफिक्स डेटा कन्स्ट्रक्टर कर सकते हैं, लेकिन उन्हें एक कोलन से शुरू होना चाहिए। तो (:) इस नियम का एक विशेष मामला है।

ताकि आप अच्छा पैटर्न प्राप्त कर सकते हैं यह विशेष सिंटेक्स जोड़ा गया है (a:as) तरह से मेल खाता है, और इसलिए वहाँ खाली [] सूची और अन्य विशेष सूची वाक्य रचना जो [1,2,3] तरह लग रहा है के बीच पत्राचार है कि।

संबंधित मुद्दे