समस्या है yntactic, इस पंक्ति में:
foreach x:[] f = (f x):[]
पैटर्न में कन्स्ट्रक्टर एप्लिकेशन को आमतौर पर संश्लेषित करने की आवश्यकता होती है। यह काम करेगा:
foreach (x:[]) f = (f x):[]
संयोग
... इसलिए दूसरी ओर आप दाएँ हाथ की ओर पर कोष्ठकों की जरूरत नहीं है समारोह आवेदन, सर्वोच्च प्राथमिकता है:
foreach (x:[]) f = f x:[]
ऊपर के लिए रखती है किसी भी इन्फ़िक्स निर्माता, लेकिन एक अंतिम नोट के रूप में, विशेष रूप से सूचियों के लिए वहाँ एक विशेष वाक्य रचना है:
foreach [x] f = [f x]
अपने कोड के साथ अन्य मुद्दों कर रहे हैं के रूप में यह खड़ा है, लेकिन है कि तत्काल त्रुटि है। अन्य समस्याओं के एक त्वरित अवलोकन:
foreach :: [a] → f → [r]
प्रकार चर परोक्ष सार्वभौमिक मात्रा निर्धारित कर रहे हैं, तो इसका मतलब यह है किसी भी प्रकार f
। आपको एक और विशिष्ट प्रकार की आवश्यकता है, अर्थात् a -> r
।
foreach x:[] f = (f x):[]
यह अनावश्यक है - पुनरावर्ती मामले को सही ढंग से यहाँ काम करेंगे, x
करने के लिए f
लागू करने और पूंछ पर ही बुला, खाली सूची मामले दे रही है। इस खाली सूची []
के खिलाफ एक सूची के सिर मिलान पैटर्न है, जिसका अर्थ है कि समारोह सूचियों की एक सूची पर काम कर रहा है -
foreach []:x f = []:(f x)
मैं इसका मतलब यह है कि आप क्या सोचते तो इसका मतलब है नहीं लगता।
foreach (x:xs) f = (f x) : (foreach (xs f))
यहां कोष्ठक या तो अनावश्यक या गलत हैं। फिर, :
जैसे ऑपरेटरों की तुलना में फ़ंक्शन एप्लिकेशन की उच्च प्राथमिकता है। इसके अतिरिक्त, (xs f)
का अर्थ xs
से f
पर लागू करना है, जैसे कि यह एक कार्य था।foreach
को दो तर्कों के लिए लागू करने के लिए, बस foreach xs f
पर्याप्त होगा।
तुलना के लिए, यहाँ मानक पुस्तकालय समारोह map
(तर्क आदेश को छोड़ कर एक) के लिए स्रोत कोड है:
map :: (a -> b) -> [a] -> [b]
map _ [] = []
map f (x:xs) = f x : map f xs
वैसे: यह पहले से मौजूद है, जिसे 'मानचित्र' कहा जाता है और आधे लाइनों में परिभाषित किया जाता है। – delnan
@ डेलनान: इस तरह के तर्कों के साथ, इसे 'for' कहा जाता है (और संभवतः 'मानचित्र' के संदर्भ में परिभाषित किया गया है)। –
@Alexandre: आह हाँ, तर्क आदेश को अनदेखा किया गया ... परिभाषा 'फ्लिप मानचित्र' होगी। – delnan