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 कार्य है:

यहां फोल्डेबल की अधिक जानकारी देखने के लिए





empty-list