2010-04-02 17 views
5

मैं समझता हूं कि हास्केल का फ़िल्टर एक उच्च ऑर्डर फ़ंक्शन है (जिसका अर्थ है एक फ़ंक्शन जो पैरामीटर के रूप में एक और फ़ंक्शन लेता है) जो एक सूची जांच करता है कि कौन सा तत्व कुछ बूलियन स्थिति को पूरा करता है।हास्केल के फ़िल्टर को समझना

मैं काफी इसकी परिभाषा समझ में नहीं आता:

filter:: (a->Bool)->[a]->[a] 
filter p [] = [] 
filter p (x:y) | p x = x:filter p y 
       | otherwise = filter p y 

मैं समझता हूँ कि अगर मैं कार्य करने के लिए एक खाली सूची पारित, यह सिर्फ एक खाली सूची वापसी होगी, लेकिन मैं अंतिम दो पंक्तियों कैसे पढ़ा करते हैं ?

+0

@ जस्टिस: मुझे आश्चर्य है कि सुधार वैध है या नहीं।शायद ओपी वास्तव में अजीब लेआउट से उलझन में था? – kennytm

उत्तर

11

यह guards का उपयोग करता है, यदि आप सी शैली सिंटैक्स वाली भाषा से आ रहे हैं तो switch संरचना के समान ही हैं।

अंतिम पैटर्न पढ़ता है: यदि कार्य px तर्क के साथ सत्य का मूल्यांकन करता है तो सूची के प्रमुख और सूची की फ़िल्टर की गई पूंछ वापस कर दें। अन्यथा बस सूची की फ़िल्टर की पूंछ वापस करें।

तुम भी यह इतना की तरह फिर से लिखने सकता है:

filter p (x:y) = if ( p x) then 
        x:filter p y 
       else 
        filter p y 
+3

इसके अलावा 'अन्यथा' prelude में 'True' के रूप में परिभाषित किया गया है। –

7

पर विचार करें description of filter in the docs:

filter, एक विधेय और एक सूची के लिए आवेदन किया, उन तत्वों को विधेय को संतुष्ट की सूची देता है; यानी,

filter p xs = [x | x <- xs, p x] 

कोई है जो सूची comprehensions समझ में नहीं आता है, तो आप कह सकते हैं filter तीन मामलों है करने के लिए यह व्याख्या करने के लिए: जब सूची होने के लिए

  1. (आसान मामले) फ़िल्टर खाली है, परिणाम भी खाली है
  2. जब सूची के प्रमुख को फ़िल्टर करने के लिए प्रमुख को संतुष्ट किया जाता है, तो यह परिणाम
  3. का हिस्सा है अन्यथा, सिर छोड़ें और शेष सूची को फ़िल्टर करें

ये मामले आपके प्रश्न में परिभाषा की अंतिम तीन पंक्तियों के साथ एक-दूसरे से मेल खाते हैं। एक खाली सूची के लिए

filter _ []  = [] 
filter p (x:xs) 
    | p x   = x : filter p xs 
    | otherwise =  filter p xs 

, विधेय कुछ भी हो सकता है, और अंडरस्कोर स्पष्ट रूप से पता चलता है कि यह उस स्थिति में महत्वहीन है:

छोटे छूता परिभाषा अधिक मुहावरेदार और इसलिए पढ़ने में आसान बना सकते हैं।

बल्कि (x:y) के खिलाफ मिलान (x:xs) बारे में सोचे का उपयोग कर, की तुलना में:, "पूर्व और व्यय" -emphasizes कि तुम और प्रकार [a] की पूंछ ((प्रकार a की) ने अपने सिर में एक सूची को अलग कर रहे हैं यानी, की सूची a)।

अंत में, filter पर रिकर्सिव कॉल को अस्तर में आसानी से पाठक को यह देखने की अनुमति मिलती है कि बाद वाला मामला x को छोड़ देता है।

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