2009-04-12 10 views
15

मुझे दो अलग-अलग हास्केल मॉड्यूल के बीच एक नाम टकराव मिला है जो एक ही इंफिक्स ऑपरेटर (<*>) का उपयोग करना चाहते हैं। हास्केल 98 रिपोर्ट का कहना है किहास्केल में प्रतीक के योग्य नाम को मैं कैसे लिखूं?

modid.varsym 

की अनुमति है, लेकिन मैं इसे काम नहीं कर सकता। उनकी सम्पूर्णता में यहाँ Test.hs हैं:

module Test 
where 

import qualified Test2 as T 

three = T.<*> 

और Test2.hs:

module Test2 
where 
(<*>) = 3 

लेकिन एक त्रुटि संदेश में परिणाम संकलित करने के लिए कोशिश कर रहा है:

Test.hs:6:12: parse error on input `T.<*>' 

मैं T.(<*>) कोशिश की, लेकिन वह काम नहीं करता या तो।

मैं import qualified द्वारा आयातित मॉड्यूल में परिभाषित प्रतीकात्मक नाम का उल्लेख कैसे कर सकता हूं?

उत्तर

15

कोशिश

three = (T.<*>) 

यह एक पूर्णांक के रूप में एक इन्फ़िक्स ऑपरेटर परिभाषित करने के लिए अजीब है। के \\ पर विचार करें (सेट अंतर ऑपरेटर):

import qualified Data.List as L 

foo = [1..5] L.\\ [1..3] -- evaluates to [4,5] 
diff = (L.\\) 

आप ऊपर देख सकते हैं, L.\\ एक योग्य इन्फ़िक्स ऑपरेटर है, और यह अभी भी एक इंफिक्स ऑपरेटर के रूप में काम करता है। इसे एक मान के रूप में उपयोग करने के लिए, आप पूरी चीज के चारों ओर कोष्ठक डालते हैं।

+0

अजीब वास्तव में, लेकिन मैं उदाहरण के रूप में संभव के रूप में सरल बनाने की कोशिश कर रहा था। –

5

याद रखें कि हम प्रतीक पैरों को मुद्रित करते हैं। जैसे

import T ((<*>)) 

इतना योग्य आयात करने में ही है:

import qualified T as Q 

main = print (Q.<*>) 
+0

यह एक अजीब स्पष्टीकरण है ... पहली पंक्ति बाकी के लिए वास्तव में प्रासंगिक नहीं है। निश्चित रूप से पहली पंक्ति "याद रखना चाहिए कि पूरी तरह से लागू ऑपरेटरों को संश्लेषित करने की आवश्यकता नहीं है।" और फिर 'f = (<*>)' बनाम 'एफ = (एम <*>)' है। – porges