list - हास्केल में खाली सूची की जांच करने के लिए==[] के बजाय शून्य फ़ंक्शन का उपयोग क्यों करें?
haskell is-empty (3)
अब तक दिए गए अच्छे उत्तरों के अलावा,
null
वास्तव में टाइप है
null :: Foldable t => t a -> Bool
मुझे नहीं पता कि आपने LYAH में टाइपकास्ट किया है, लेकिन इसकी कमी यह है कि
null
का उपयोग केवल सूचियों के लिए नहीं किया जा सकता है, बल्कि किसी भी डेटा संरचना के लिए जो
null
।
यह कहना है कि
Map
या
Set
पर
null
का उपयोग करना भी मान्य है।
> null Map.empty
True
> null (Map.singleton 1)
False
> null Set.empty
True
> null (Set.singleton 1)
False
> null []
True
> null [1]
False
मुझे नहीं लगता कि यह विशेष रूप से उन कार्यों को लिखने के लिए सामान्य है जो इस सामान्य होने की आवश्यकता है, लेकिन यह अधिक सामान्य कोड लिखने के लिए डिफ़ॉल्ट रूप से चोट नहीं करता है।
एक साइड नोट
कई मामलों में, आप एक सूची (या अन्य डेटा संरचना) पर सशर्त व्यवहार करने के लिए
null
जैसे फ़ंक्शन का उपयोग करना चाहते हैं।
यदि आप पहले से ही जानते हैं कि आपका इनपुट एक विशिष्ट डेटा संरचना है, तो इसके खाली मामले पर सिर्फ पैटर्न मैच के लिए अधिक सुरुचिपूर्ण है।
तुलना
myMap :: (a -> b) -> [a] -> [b]
myMap f xs
| null xs = []
myMap f (x:xs) = f x : myMap f xs
सेवा मेरे
myMap' :: (a -> b) -> [a] -> [b]
myMap' f [] = []
myMap' f (x:xs) = f x : myMap' f xs
सामान्य तौर पर, यदि आपको समझ में आता है तो आपको पैटर्न से मेल खाने को प्राथमिकता देने की कोशिश करनी चाहिए।
मैं ग्रेट गुड के लिए लर्न यू हास्केल के "स्टार्टिंग आउट" अध्याय के माध्यम से पढ़ रहा हूं ! । इसे कहते हैं:
यदि कोई सूची
null
तोnull
चेक करता है। अगर यह है, तो यहTrue
, अन्यथा यहFalse
रिटर्न देता है।xs == []
बजाय इस फ़ंक्शन का उपयोग करें (यदि आपके पासxs
नामक सूची है)
मैंने गश में कोशिश की:
xs = [] -- and then,
xs == []
null xs
दोनों ही
True
।
मुझे आश्चर्य है कि क्या अंतर है।
क्या मुझे
== []
बजाय
null
फ़ंक्शन का उपयोग करना चाहिए और क्यों?
आपको
null
उपयोग करना चाहिए।
ज्यादातर मामलों में यह कोई मायने नहीं रखता है, लेकिन वैसे भी इसमें शामिल होना एक अच्छी आदत है, क्योंकि कभी-कभी आप यह देखना चाहते हैं कि गैर-तुलनीय चीजों की सूची खाली है या नहीं।
यह अंतर दिखाने वाला एक छोटा, कुरकुरा उदाहरण है:
> null [id]
False
> [id] == []
<interactive>:1:1: error:
• No instance for (Eq (a0 -> a0)) arising from a use of ‘==’
(maybe you haven't applied a function to enough arguments?)
• In the expression: [id] == []
In an equation for ‘it’: it = [id] == []
सभी खाली सूची को फ़िल्टर करने वाला एक साधारण कार्य भी विफल हो जाएगा:
withoutEmpty = filter (== [])
और यह होगा:
withoutEmpty = filter null
नोटिस जो:
withoutEmpty ls = filter (==[]) ls
ठीक काम करेगा, लेकिन महत्वपूर्ण बात यह है कि कुछ मामलों में दूसरे की तरह विफल हो सकता है।
@Cole उत्तर को भी देखें, यह सभी उत्तरों को यहाँ पूरक करता है, टाइपकास्ट फोल्डेबल को लागू करने के लिए
null
कार्य है:
यहां फोल्डेबल की अधिक जानकारी देखने के लिए