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
पर मूल्यांकन करता है)।
ठीक है, लेकिन आपने कैसे पता लगाया कि == tuples पर लागू किया गया था? – Fof
@ सेबा क्योंकि 'करी' एक ऐसे फ़ंक्शन की अपेक्षा करता है जिसका पहला तर्क एक ट्यूपल है। – sepp2k