2011-10-04 11 views
7
test :: String -> String -> Int 

test' x y n = n 
test' "" (y:ys) n = error "error" 
test' (x:xs) "" n = error "error" 
test' (x:xs) (y:ys) n = 
     if  x == y 
     then test' xs ys n 
     else test' xs ys (n+1) 
test a b = test' a b 0 

जब मैं इस संकलन ओवरलैप कर रहे हैं, मैं इस उत्पादन प्राप्त करें:हास्केल - प्रतिमान मिलान (ते)

Warning: Pattern match(es) are overlapped 

और जवाब हमेशा "0" जो नहीं है कि मैं क्या इरादा है। कोड के साथ समस्या और इसे कैसे ठीक किया जाए?

उत्तर

9

test' x y n = n प्रत्येक कॉल के लिए मेल खाएगा, अन्य पैटर्न पर विचार नहीं किया जाएगा। मुझे लगता है कि यह मामला test' "" "" n = n होना चाहिए। यदि आप अपनी मूल रेखा अंत (जब सभी अन्य मामले विफल हो जाते हैं) पर आपको एक ही परिणाम मिलते हैं, लेकिन फिर आपको test' _ _ n = n लिखना चाहिए जो दिखाता है कि आप जानबूझकर कुछ तर्कों को अनदेखा करते हैं।

[संपादित करें]

एक छोटा समाधान होगा:

test a b | length a == length b = sum $ map fromEnum $ zipWith (/=) a b 
     | otherwise = error "error" 

zipWith अभिव्यक्ति Bool की एक सूची है जो हर अंतर के लिए True है उत्पन्न करता है। फ़ंक्शन fromEnum मानचित्र False से 0 और True से 1 पर नक्शा।

+0

बहुत उपयोगी! मैंने बहुत कुछ सीखा है! धन्यवाद – Ferry

7

पैटर्न क्रम में प्रयास किया जाता है। test' के लिए आपके पैटर्न का पहला मिलान हमेशा मेल खाता है, इसलिए मामला हमेशा उपयोग किया जाता है। पहला मामला शायद

test' "" "" n = n 

इसके बजाय होना चाहिए।

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