2015-03-04 7 views
6

स्थिति के आधार पर, हास्केल में आंशिक अनुप्रयोगों का सही उत्तर मिलता है।ऑपरेटर अनुभागों के लिए `-` (minus) क्यों काम नहीं करता है?

Prelude> (/2) 10 
5.0 
Prelude> (2/) 10 
0.2 
Prelude> (+3) 10 
13 
Prelude> (3+) 10 
13 

हालांकि, के लिए - ऑपरेटर, मैं एक त्रुटि (-3) साथ मिला हास्केल (लगता है) के रूप में एक मूल्य -3 आंशिक नहीं आवेदन के रूप में यह व्याख्या करता है।

Prelude> (-3) 10 

<interactive>:4:1: 
    Could not deduce (Num (a0 -> t)) 
     arising from the ambiguity check for ‘it’ 
    from the context (Num (a -> t), Num a) 
     bound by the inferred type for ‘it’: (Num (a -> t), Num a) => t 
     at <interactive>:4:1-7 
    The type variable ‘a0’ is ambiguous 
    When checking that ‘it’ 
     has the inferred type ‘forall a t. (Num (a -> t), Num a) => t’ 
    Probable cause: the inferred type is ambiguous 

इस उदाहरण में 7 प्राप्त करने के लिए इस समस्या को हल करने के लिए कैसे करें?

उत्तर

15

subtract का उपयोग करें। , इसलिए

let a = -3  -- prefix variant 
let b = (-3) -- also prefix variant! 
let c = 4 - 3 -- binary variant 

आप (subtract 3) 10 का उपयोग करना होगा: - हास्केल में केवल ऑपरेटर, एक उपसर्ग और द्विआधारी इन्फ़िक्स संस्करण में दोनों होता है। भी section 3.4 in the Haskell 2010 report (जोर मेरा) देखें:

विशेष रूप -e को दर्शाता है उपसर्ग निषेध, हास्केल में केवल उपसर्ग ऑपरेटर, और negate (e) के लिए वाक्य रचना है। द्विआधारी - ऑपरेटर प्रलोड में - की परिभाषा का जरूरी नहीं है; यह मॉड्यूल सिस्टम द्वारा रिबाउंड हो सकता है। हालांकि, unary - हमेशा प्रस्तावना में परिभाषित negate फ़ंक्शन का संदर्भ लेंगे। - ऑपरेटर और असामान्य अस्वीकृति के स्थानीय अर्थ के बीच कोई लिंक नहीं है।

प्रीफिक्स अस्वीकृति प्रीफूड में परिभाषित इंफिक्स ऑपरेटर - के रूप में वही प्राथमिकता है (तालिका 4.1 देखें)। क्योंकि e1-e2 बार्सरी ऑपरेटर - के इंफिक्स एप्लिकेशन के रूप में पार्स, वैकल्पिक पार्सिंग के लिए e1(-e2) लिखना होगा। इसी प्रकार, (-)(\ x y -> x-y) के लिए सिंटैक्स है, जैसा कि किसी भी इंफिक्स ऑपरेटर के साथ है, और (\ x -> -x) को इंगित नहीं करता है - इसके लिए negate का उपयोग करना चाहिए।

और section 3.5 निष्कर्ष निकाला है (फिर से, जोर मेरा):

- व्याकरण में विशेष रूप से इलाज किया जाता है क्योंकि, (- exp) नहीं एक वर्ग, पिछले अनुभाग में वर्णित के रूप में है, लेकिन उपसर्ग निषेध का एक आवेदन पत्र । हालांकि, प्रीलूड में परिभाषित subtract फ़ंक्शन है जो (subtract exp) अस्वीकृत अनुभाग के बराबर है। अभिव्यक्ति (+ (- exp)) एक ही उद्देश्य की सेवा कर सकती है।

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