2014-04-22 10 views
6

मैं समझता हूँ कि:करी (==) कैसे काम करता है?

(==) :: Eq एक => एक -> एक -> बूल

आवेदन का एक उदाहरण हो सकता है (==) 2 2, जो परिणाम सच हैं।

और कहा कि:

uncurry (==) :: Eq ख => (ख, ख) -> बूल।

आवेदन का एक उदाहरण अनिश्चित (==) (2, 2) हो सकता है, जिसके परिणामस्वरूप सत्य है।

लेकिन मैं समझता हूँ और एक उदाहरण कल्पना क्यों नहीं है:

करी (==) :: (Eq एक, समीकरण ख) => एक -> ख -> (ए, बी) - > बूल

कोई मदद?

धन्यवाद,
सेबेस्टियन

उत्तर

8

curry की परिभाषा है:

curry :: ((a, b) -> c) -> a -> b -> c 
curry f = \x y -> f (x, y) 

हम स्थानापन्न हैं कि में:

\x y z -> (curry (==) x y) z 
\x y z -> ((==) (x, y)) z -- Function application 
\x y z -> (==) (x, y) z  -- Remove parentheses (function application is left associative in Haskell, so they are unnecessary here) 
\x y z -> (x, y) == z  -- Convert to infix 

हम अभी बता सकता है कि z किसी तरह का होना चाहिए टुपल के साथ-साथ, या तो यह अंतिम पंक्तिके दोनों तर्कों के बाद से चेक टाइप नहीं करेगीएक ही प्रकार का होना चाहिए।

जब हम Eq के लिए टपल उदाहरण की परिभाषा को देखो, हम पाते हैं

instance (Eq a, Eq b) => Eq (a, b) where 
    (x, y) == (x', y') = (x == x') && (y == y') 

(यह मानक पुस्तकालय के स्रोत कोड में लिखा हुआ नहीं है, यह वास्तव में "स्टैंडअलोन पाने" का उपयोग करता है तंत्र स्वचालित रूप से (Eq a, Eq b) => (a, b) प्रकार के लिए उदाहरण प्राप्त करने के लिए। इस कोड को हालांकि क्या व्युत्पन्न हो जाता है के बराबर है।)

इसलिए, इस मामले में, हम == है जैसे कि यह प्रकार है इलाज कर सकते हैं

(==) :: (Eq a, Eq b) => (a, b) -> (a, b) -> Bool 

दोनों x और y प्रकार है कि Eq के उदाहरण हैं होना आवश्यक है, लेकिन वे Eq की ही उदाहरण होने की जरूरत नहीं है। उदाहरण के लिए, यदि हमारे पास 12 और "abc" है तो क्या होगा? वे दो अलग-अलग प्रकार हैं लेकिन हम अभी भी हमारे फ़ंक्शन का उपयोग कर सकते हैं, क्योंकि वे Eq के दोनों उदाहरण हैं: (\x y z -> (x, y) == z) (12, "abc") (30, "cd") (यह अभिव्यक्ति प्रकार चेक और False पर मूल्यांकन करता है)।

9

== tuples पर उपयोग किया जा सकता है, तो आप (a1, b1) == (a2, b2) लिख सकते हैं।

उस स्थिति में == का प्रकार (Eq a, Eq b) => (a, b) -> (a,b) -> Bool के लिए विशिष्ट है।

यदि आप अब उस प्रकार के curry लागू करते हैं, तो आपको (Eq a, Eq b) => a -> b -> (a, b) -> Bool मिल जाएगा।

+0

ठीक है, लेकिन आपने कैसे पता लगाया कि == tuples पर लागू किया गया था? – Fof

+4

@ सेबा क्योंकि 'करी' एक ऐसे फ़ंक्शन की अपेक्षा करता है जिसका पहला तर्क एक ट्यूपल है। – sepp2k

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