2011-11-13 9 views
5

द्वारा बाध्य एक कठोर प्रकार चर है इसलिए मुझे एहसास है कि यह एक संभावित डुप्लिकेट है प्रश्न, क्योंकि स्टैक ओवरफ़्लो पर उन त्रुटियों में से कई त्रुटियों की सूचना दी गई है, लेकिन कोई भी समस्या मेरी समस्या पर लागू नहीं होती है।हास्केल, भले ही मेरा प्रकार निर्दिष्ट नहीं है, मुझे यह त्रुटि मिलती है: 'ए' के ​​साथ 'ए' टाइप नहीं किया जा सका, 'ए'

elementAt' :: Integral b => [a] -> b -> a 
elementAt' [x:_] 1 = x 
elementAt' [x:xs] y = elementAt' xs yminus1 
    where yminus1 = y - 1 

मामले में आप सोच रहे हैं कि 99 Haskell Problems से यह समस्या 3 है:

तो मैं निम्नलिखित समारोह है। फ़ंक्शन का लक्ष्य एक सूची और एक सूचकांक इनपुट के रूप में लेना है, और उस सूचकांक (1 से शुरू) पर मान वापस करना है। मैं समस्या का समाधान नहीं चाहता, अगर मैंने किया तो मैं केवल प्रदान किए गए लोगों को देख सकता हूं। लेकिन मुझे एक त्रुटि मिल रही है जिसे मैं समझ नहीं पा रहा हूं। मैं eclipseFP, हास्केल के लिए ग्रहण प्लगइन का उपयोग कर रहा है और यह रेखांकित किया है "[एक्स: _]" और "[x: XS]" निम्न त्रुटि के साथ समारोह के कुछ भागों:

Couldn't match type `a' with `[a]' 
`a' is a rigid type variable bound by 
the type signature for elementAt' :: Integral b => [a] -> b -> a 

सभी धागे में जो इस त्रुटि पर चर्चा करता है कि मैंने समस्या को देखा है आमतौर पर तब होता है जब कोई किसी निश्चित प्रकार की अपेक्षा करने वाले किसी चीज़ को गलत आउटपुट देने का प्रयास करता है। उदाहरण के लिए, किसी चीज़ की लंबाई (जो प्रकार int है) को वापस करने के लिए "Num a" चर प्रकार होना चाहिए।

लेकिन मेरे मामले में मैं चर के लिए एक प्रकार भी प्रदान नहीं कर रहा हूं। यह कुछ भी हो सकता है, है ना? तो मुझे यह त्रुटि क्यों मिल रही है? अगर मुझे समझ में आया कि मुझे त्रुटि क्यों मिल रही है तो मैं इसे ठीक कर सकता हूं, लेकिन मुझे समझ में नहीं आता है।

क्या कोई मुझे बता सकता है कि मुझे यह त्रुटि क्यों मिल रही है?

आपकी मदद की बहुत सराहना की है, धन्यवाद। -Asaf

संपादित करें: अब तक प्रदान किया गया हर उत्तर सही है, उपयोगी जानकारी के लिए सभी को धन्यवाद। मैं उस व्यक्ति को चुनने जा रहा हूं जिसे मैं सबसे स्पष्ट मानता हूं (मुझे इसे करने के लिए 5 मिनट का इंतजार करना होगा)।

+0

क्यों न केवल 'तत्व' लिखें [x: xs] y = element 'xs (y-1) '' –

+0

@Vixen मैंने जो लिखा है उससे अलग कैसे है ... एक परिवर्तनीय घोषणा सहित अन्य? स्पष्ट रूप से संकलक किसी भी मामले में एक ही चीज़ को ठीक कर देगा (अगर मैं गलत हूं तो मुझे सही करें)। – Asaf

+0

हां, यह वही है, मुझे लगता है कि यह yminus1 के रूप में कुछ घोषित करने के लिए अजीब लग रहा है, जब y-1 अधिक आसानी से पढ़ता है और मेरी राय में सुंदर दिखता है –

उत्तर

3

आप सिर और पूंछ को सूची से मिलान करने के लिए चाहते हैं, तो आप

elementAt' (x:_) 1 = x 

तो, अंत में

elementAt' :: Integral b => [a] -> b -> a 
elementAt' (x:_) 1 = x 
elementAt' (x:xs) y = elementAt' xs yminus1 
    where yminus1 = y - 1 

और

λ> elementAt' [1,2,3] 2 
2 

आपको क्या चाहिए यह है इस्तेमाल करना चाहिए?

1

उपयोग कोष्ठक, नहीं कोष्ठक: (x:xs)

module Aaa where 

elementAt' (x:_) 1 = x 
elementAt' (x:xs) y = elementAt' xs yminus1 
    where yminus1 = y - 1 
+0

हालांकि आप समाधान को समझते हैं, तो पूछताछकर्ता नहीं कर सकता - आपने संबोधित नहीं किया है 'क्या कोई मुझे बता सकता है कि मुझे यह त्रुटि क्यों मिल रही है?' –

+0

@ डेलन ने ऊपर एक स्पष्टीकरण दिया। आम तौर पर मैं अधिक विस्तृत उत्तर देने की कोशिश करता हूं। समस्या का कारण बताए जाने के लिए – nponeccop

9

बिना प्रकार घोषणा अपनी परिभाषा में प्रवेश कर पता चलता है कि अनुमानित प्रकार Integral b => [[a]] -> b -> a है। यह सही है, आपके वर्तमान पैटर्न सूचियों की सूचियों से मेल खाते हैं।

तरह

f [pat] = ... 

एक पैटर्न एक सिंगलटन सूची जिसका एकमात्र घटक मेल खाते हैं pat मेल खाता है। इसके बजाय आप एक निश्चित लंबाई की आवश्यकता वाले की (:) उर्फ ​​cons साथ काम करना चाहते हैं, और फिर आप कोष्ठक के बजाय कोष्ठक की जरूरत है:

elementAt' (x:xs) n = ... 

त्रुटि मूल रूप से कहते हैं, "आप a (पहला तर्क के तत्वों) का इलाज के रूप में अगर यह एक सूची थी "।

+1

+1, न केवल त्रुटियों को दूर करने के लिए। –

3

But in my case I'm not even providing a type for variable a. It should be able to be ANYTHING, right?

इसे कुछ भी करने में सक्षम होना चाहिए। आपके प्रकार के हस्ताक्षर के अनुसार आपके फ़ंक्शन के उपयोगकर्ता को aInt के साथ a[Char] या 'ए' के ​​साथ जो भी उपयोगकर्ता चाहता है, के साथ अपने फ़ंक्शन को कॉल करने में सक्षम होना चाहिए।

हालांकि त्रुटि संदेश आपको बता रहा है कि आपने अपना फ़ंक्शन परिभाषित किया है ताकि इसे किसी की सूची होने के कारण a पर कॉल करना संभव हो। अर्थात। आपने इसे परिभाषित किया है, ताकि पहला तर्क सूचियों की सूची होनी चाहिए - यह किसी और चीज की सूची नहीं हो सकती है। और यह आपके प्रकार के हस्ताक्षर के विपरीत है।

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