मैं एक ट्यूपल को क्रेट करना चाहता हूं, जिसमें एक तीर और तीर है जो तीर का वर्णन करती है।टस्कल्स के अंदर हास्केल तीर
funTimes10 = (*10)
describe10 = "times 10"
tuple10 :: (Num b) => ((b -> b), String)
tuple10 = (,) funTimes10 describe10
मैं fst
साथ समारोह का उपयोग कर सकते हैं, और snd
साथ मैं समारोह का वर्णन स्ट्रिंग प्राप्त: अगर मैं कार्यों (तीर के बजाय), निम्न कार्य करता उम्मीद की तरह साथ ऐसा करते हैं।
हालांकि, अगर मैं निम्नलिखित में ऐरो से समारोह का आदान-प्रदान, जैसे:
aTuple10 :: (Arrow a, Num b) => (a b b, String)
aTuple10 = (,) (arr funTimes10) describe10
fst
अभी भी काम करता है और मेरी तीर दिखाए, लेकिन- मैं के साथ किसी भी वर्णन स्ट्रिंग नहीं मिलता है
snd
।
मैं केवल इस त्रुटि-संदेश मिला:
Ambiguous type variable `a0' in the constraint:
(Arrow a0) arising from a use of `aTuple10'
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `snd', namely `aTuple10'
In the expression: (snd aTuple10)
In an equation for `it': it = (snd aTuple10)
मैं इस त्रुटि क्यों मिलता है, और मुझे क्या करना चाहिए, यह से बचने के लिए? snd
के प्रकार पर
यह बिल्कुल है;) thx – frosch03
कितना परेशान है। एक उम्मीद करेगा कि टाइप सिस्टम यह निष्कर्ष निकालने में सक्षम होगा कि 'snd aTuple10' में' स्ट्रिंग' टाइप है; क्या इसे कार्यान्वयन में एक बग माना जा सकता है? निश्चित रूप से हास्केल 2010 इस तरह के व्यवहार को निर्दिष्ट नहीं करता है। कोई तर्क दे सकता है कि यदि कार्यान्वयन नहीं जानता कि पहली चीज़ किस प्रकार है, तो यह नहीं पता कि दूसरी बात मेमोरी में कहां है, लेकिन चूंकि हम यहां बॉक्स किए गए ट्यूपल्स से निपट रहे हैं, इसलिए हमेशा दो पॉइंटर्स होना चाहिए, और इसलिए पहला तत्व आसानी से पहले के प्रकार के बावजूद locatable है। –
'क्लास बूलिश' जैसे एक समारोह जहां बूल :: ए -> बूल; foo :: बूलिश ए => (ए, बी) -> बी; foo (ए, बी) = यदि एक बुलबुला है तो बी और अपरिभाषित 'कल्पनाशील है, इसलिए फ़ंक्शन का परिणाम अस्पष्ट पैरामीटर पर निर्भर हो सकता है। उस स्थिति में 'snd' के लिए विशेष आवरण अजीब होगा। – dflemstr