11

मुझे यह समझने में परेशानी हो रही है कि फ़ंक्शन एप्लिकेशन हैकेल में करी के साथ कैसे काम करता है। अगर मैं निम्नलिखित कार्य हो:हास्केल डॉलर ऑपरेटर एप्लिकेशन

($) :: (a -> b) -> a -> b 

मैं समझता हूँ कि आंशिक रूप से इस समारोह को लागू करने के मैं (a -> b) समारोह ($ के पहले तर्क) प्रदान करने के लिए की जरूरत है।

फिर मूल्य को पहले लागू करना क्यों संभव है (यानी रिवर्स तर्क)?

($ 0) :: Num a => (a -> b) -> b 

मैं यहाँ क्या याद आ रही है?

उत्तर

13

($) एक ऑपरेटर है। हास्केल में, किसी भी ऑपरेटर एक बाएं भाग में लिखा जा सकता है (जैसे (x $)) या एक सही-धारा (($ x) की तरह):

(x $) = (\y -> x $ y) = ($) x 
($ x) = (\y -> y $ x) = flip ($) x 

नोट इस नियम का एकमात्र अपवाद (-) है कि, क्रम में आसानी से ऋणात्मक संख्याओं को लिखने के लिए:

\x -> (x-) :: Num a => a -> a -> a -- equivalent to \x -> (-) x 
\x -> (-x) :: Num a => a -> a  -- equivalent to \x -> negate x 

मामले में आप ने संक्षेप में (\y -> y - x) लिखना चाहते हैं, आप subtract उपयोग कर सकते हैं:

\x -> subtract x :: Num a => a -> a -> a -- equivalent to \x -> flip (-) x 
+0

धन्यवाद, यह बताता है कि यह इस तरह से क्यों काम कर रहा है। क्या ये परिभाषाएं भाषा की विशेषताएं हैं या क्या वे स्रोतों में कहीं भी मिल सकती हैं? – Rumca

+2

@Rumca वास्तव में स्रोत में नहीं है, (x $) और ($ x) अनुभाग हैं और उनमें से एक विवरण [2010 हैकेल रिपोर्ट] में पाया जा सकता है (http://www.haskell.org/onlinereport/haskell2010/) [सेक्शन सेक्शन] में (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-300003.5)। – Davorak

+0

भाषा का वर्णन [हास्केल 2010 रिपोर्ट] (http://www.haskell.org/onlinereport/haskell2010/) में किया गया है। –

4

($ 0)(\x -> x $ 0)(\x -> ($) x 0)

तो ($) :: (a -> b) -> a -> b) और हम (\x -> ($) x 0) तरह दूसरा तर्क लागू किया हम :: Num a => (a -> b) -> b

2

आप किसी फ़ंक्शन के साथ ऑपरेटर के इन्फिक्स नोटेशन को भ्रमित कर रहे हैं।

> :t (($) (+1)) 
(($) (+1)) :: Num b => b -> b 

यहाँ बेहतर समझ के लिए, $ साथ भाव के कुछ प्रकार हैं:

एक $ ख => ($) अब

($ ख) => फ्लिप ($) ख => (\ बा -> ($) ab) ख => \ एक -> ($) अब

(एक $) => ($) एक => \ b -> ($) अब

+0

-1 यहां तक ​​कि कोई भी जो दृढ़ता से समझता है कि यह प्रश्न क्या है और तर्क क्या है, मुझे यह जवाब समझ में नहीं आता है। हास्केल को नहीं जानता जो कोई भी इस बारे में समझने वाला है? ऑपरेटर और कार्यों के बीच अंतर क्या है इसका कोई स्पष्टीकरण नहीं। '$ बी => फ्लिप ($) बी => \ ए -> ($) एक बी' वैध वाक्यविन्यास भी नहीं है। (संपादित करें: ठीक है, यह -1 होगा यदि मेरे पास थोड़ा और प्रतिनिधि था।) –

1

ध्यान दें कि हास्केल वाक्यविन्यास में, अल्फान्यूमेरिक नाम विराम चिह्नों से अलग हैं।

एक अल्फान्यूमेरिक फ़ंक्शन foo1 a b डिफ़ॉल्ट रूप से उपसर्ग है, और यदि आप बैकटीक्स जोड़ते हैं तो infix बन जाता है: a `foo` b

$ या <*> की तरह एक विराम चिह्न नाम समारोह डिफ़ॉल्ट रूप से इन्फ़िक्स है, और यदि आप कोष्ठकों ($) या (<*>) जोड़ने उपसर्ग हो जाता है। लैटिन वर्णमाला से परिचित प्रोग्रामर के लिए यह सिंटैक्स चीनी है; यह अल्फान्यूमेरिक नामों और विराम चिह्नों के नामों के बीच एक मनमाना लेकिन उपयोगी अंतर है।

दोनों प्रकार के कार्य केवल कार्य हैं, उनके पास विशेष अर्थपूर्ण नियम नहीं हैं जो हमारे पास सी ++ या जावा में "ऑपरेटरों" के लिए हैं। यह उपसर्ग/इन्फिक्स और बैकटिक्स/कोष्ठक के आसपास सिंटैक्स नियम है जो विराम चिह्न-नामित फ़ंक्शंस और अल्फान्यूमेरिक-नामित फ़ंक्शंस के बीच अलग हैं।

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