2012-02-23 16 views
5

में # मूल्य प्रतिबंध मैं एक एफ # समारोह है। यह काम करता है अगर मैं कुछ आवेग सूची देता हूं, जैसे removeEven ['1';'2';'3'] मुझे ['1';'3'] मिलता है जो मुझे माना जाता है। लेकिन जब मैं पैरामीटर के रूप में एक खाली सूची डालता हूं, तो मुझे यह त्रुटि मिलती है:एफ खाली सूची

stdin(78,1): error FS0030: Value restriction. The value 'it' has been inferred to have generic type

val it : '_a list Either define 'it' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation.

सहायता, कोई भी?

उत्तर

7

खाली सूची ([]) काफी विशिष्ट है; यह किसी भी प्रकार की सूची हो सकती है। इसलिए, संकलक शिकायत करता है कि आपके पास [] के लिए कोई विशिष्ट प्रकार नहीं है। के रूप में @kvb ने सुझाव दिया

let results = removeEven ([]: int list) 

या अधिक मुहावरेदार प्रकार एनोटेशन: तर्क पर प्रकार एनोटेशन जोड़ने समस्या को हल करने में मदद करता है

let results: int list = removeEven [] 

इस सवाल से परे शायद है, लेकिन अपने कार्य करना चाहिए removeOdd के रूप में नामित किया जाना चाहिए क्योंकि सूचकांक अक्सर 0 से शुरू होते हैं और आपका कार्य अजीब सूचकांक वाले सभी तत्वों को हटा देता है। इसके अलावा, अगर आप चीजों पैटर्न बल्कि जाँच सूचकांक के लिए एक काउंटर x रखने से सूची के पहले दो तत्वों पर मिलान का उपयोग भी बहुत कुछ स्पष्ट कर रहे हैं:

let rec removeOdd = function 
    | [] -> [] 
    | [x] -> [x] 
    | x::_::xs -> x::removeOdd xs 
+0

ध्यान दें कि आप इसके बजाय सीधे 'results' को एनोटेशन जोड़ सकते हैं, जो अधिक मूर्खतापूर्ण हो सकता है। – kvb

+0

प्रस्तावित निकालेंऑड फ़ंक्शन विफल रहता है जब तर्क '[]' होता है। मैं इसे सामान्य तरीके से हल करने की कोशिश कर रहा हूं, लेकिन मैं '[] 'केस को" त्रुटि FS0030: वैल्यू प्रतिबंध "के बिना संभालने का प्रबंधन नहीं कर सकता। क्या ऐसा कार्य वास्तव में सामान्य बनाना संभव है? – TurboHz

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