2012-01-31 15 views
6

मैं sml सीख रहा हूँ हो रही है, और लिखा है निम्नलिखित सरल समारोह:यह पैटर्न संपूर्ण लगता है, लेकिन मैं अभी भी चेतावनी

(* Return a list with every other element of the input list *) 
fun everyOther [] = [] 
    | everyOther [x] = [x] 
    | everyOther x = let 
     val head::head2::tail = x 
    in 
     head::everyOther(tail) 
    end; 

निम्नलिखित में से कौन चेतावनी पैदा कर रहा है:

! Toplevel input: 
! val head::head2::tail = x 
!  ^^^^^^^^^^^^^^^^^ 
! Warning: pattern matching is not exhaustive 

मैं मान लें कि फ़ंक्शन कभी विफल नहीं हो सकता है, क्योंकि val head::head2::tail हमेशा दो या दो से अधिक तत्वों के साथ सूचियों के लिए काम करेगा और एक तत्व के मामले और शून्य तत्व शामिल होंगे। जहां तक ​​मैं कह सकता हूं, यह फ़ंक्शन अपेक्षा के अनुसार काम करता है। मुझे लगता है कि यह समस्या [] के उपयोग से संबंधित हो सकती है लेकिन मुझे वास्तव में पता नहीं है।

  1. sml ऐसा क्यों लगता है कि यह इन्हीं तक (मैं यह कैसे बदल रहा) नहीं है:

    मेरा प्रश्न वास्तव में तीन गुना है?

  2. क्या कोई ऐसा मामला है जहां यह कार्य विफल हो जाएगा?
  3. क्या मैं इस तरह से कुछ गूंगा लेखन लिख रहा हूं?

उत्तर

5
  1. एसएमएल क्योंकि यह पता नहीं है कि x कम से कम दो तत्व है आपको लगता है कि चेतावनी देता है। यह सब जानता है कि x एक सूची है, यह इस तथ्य को याद नहीं रखती है कि x को तीसरे मामले में जाने के लिए पहले दो पैटर्नों से मेल नहीं करना पड़ा था।

  2. नहीं, कोड विफल नहीं हो सकता है।

  3. लेट-स्टेटमेंट में पैटर्न मिलान करने का कोई कारण नहीं है।

    fun everyOther [] = [] 
        | everyOther [x] = [x] 
        | everyOther (head::head2::tail) = head :: everyOther tail; 
    
+0

धन्यवाद: तुम बस fun बयान है, जो कम कोड में परिणाम और चेतावनी को निकाल देंगे करने के लिए पैटर्न डाल कर सकते हैं! मैं अभी भी पैटर्न में जा सकते हैं के आसपास अपने सिर लपेटने की कोशिश कर रहा हूँ। त्वरित सवाल हालांकि: क्या यह चेतावनी को हटा देता है क्योंकि पैटर्न में 'हेड :: हेड 2 :: पूंछ' डालने से sml को पता चल जाता है कि कम से कम दो तत्व हैं? या यहां काम पर कुछ और है? – Wilduck

+1

@Wilduck यह चेतावनी को हटा देता है क्योंकि सूची में मौजूद प्रत्येक मान के लिए, इसमें एक पैटर्न मिल रहा है। जब आपने 'वैल हेड :: हेड 2 :: पूंछ = x' किया था तो यह मामला नहीं था क्योंकि उस पैटर्न मैच में कम से कम 2 तत्वों के साथ सूचियों के लिए केवल एक मामला था। – sepp2k

+0

यह सही समझ में आता है। 15 मिनट में आपने बस कुछ ऐसा डिमस्टिफाइड किया था जिसे मैंने पहले ही आधा घंटे बिताया था। फिर से धन्यवाद। – Wilduck

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