2012-03-30 15 views
5

में फ़ंक्शन के प्रकार का निर्धारण करना निम्नलिखित समीकरण मिरांडा सिंटेक्स में लिखे गए हैं, लेकिन मिरांडा और हास्केल के बीच समानता के कारण मुझे उम्मीद है कि हास्केल प्रोग्रामर को इसे समझना चाहिए!कार्यात्मक प्रोग्रामिंग

आप निम्नलिखित कार्यों को परिभाषित हैं:

rc v g i = g (v:i) 
rn x = x 
rh g = hd (g []) 


f [] y = y 
f (x:xs) y = f xs (rc x y) 

g [] y = y 
g (x:xs) y = g xs (x:y) 

तुम कैसे बाहर काम करता है के प्रकार के काम करते हैं? मुझे लगता है कि मैं समझता हूं कि एफ, जी और आरएन के लिए इसे कैसे काम करना है, लेकिन मैं आंशिक आवेदन भाग के बारे में उलझन में हूं।

आर.एन. होने जा रहा है * -> * (या कुछ भी -> कुछ भी, मुझे लगता है कि यह एक है -? हास्केल में> एक ​​)

F और G के लिए, समारोह प्रकार दोनों हैं [*] -> * -> *?

मुझे यकीन है कि आरसी और rh के प्रकारों को खोजने के तरीके को कैसे सुनिश्चित किया जाए। आरसी में, जी को आंशिक रूप से परिवर्तनीय I पर लागू किया जा रहा है - इसलिए मुझे लगता है कि यह मुझे प्रकार के प्रकार को बाधित करता है [*]। आरसी और जी आरसी की परिभाषा में क्या आदेश लागू हैं? क्या जी ने मुझे लागू किया है, और फिर परिणामस्वरूप फ़ंक्शन आरसी के लिए तर्क के रूप में उपयोग किया जाता है? या आरसी, वी और जी के 3 अलग-अलग पैरामीटर लेता है? मैं वास्तव में उलझन में हूँ .. किसी भी मदद की सराहना की जाएगी! धन्यवाद दोस्तों।

hd :: [*] -> * 
hd (a:x) = a 
hd [] = error "hd []" 
+0

क्या यह होमवर्क है? –

+0

नहीं, मैं अभी परीक्षाओं की तैयारी कर रहा हूं और यह मिरांडा परीक्षा के लिए एक पुराना परीक्षा प्रश्न है। – user1058210

+0

'hd' फ़ंक्शन का प्रकार क्या है? –

उत्तर

6

प्रकार क्या पहले से ही प्रकार के लिए जाना जाता है और कैसे भाव परिभाषा में उपयोग किया जाता से अनुमान लगाया जाता है:

क्षमा करें जोड़ने के लिए है कि HD एक सूची के लिए मानक सिर समारोह है और के रूप में परिभाषित किया गया है भूल गया।

के शीर्ष पर शुरू करते हैं,

rc v g i = g (v : i) 

तो rc :: a -> b -> c -> d और हम बाहर पाया जा सकता है के बारे में a, b, c और d देखना होगा। दाईं ओर, (v : i) दिखाई देता है, इसलिए v :: a के साथ, हम देखते हैं कि i :: [a], c = [a]। तब gv : i को लागू किया जाता है, तो g :: [a] -> d, कुल मिलाकर,

rc :: a -> ([a] -> d) -> [a] -> d 

rn x = x मतलब है rn का तर्क प्रकार पर कोई बाधा नहीं है और इसकी वापसी प्रकार, एक ही है rn :: a -> a कि।

rh g = hd (g []) 

के बाद से rh तर्क g आरएचएस पर एक खाली सूची के लिए लागू किया जाता है, यह प्रकार [a] -> b होना आवश्यक है, संभवतः अधिक जानकारी के बारे में a या b इस प्रकार है। दरअसल, g []hd आरएचएस पर है, तो g [] :: [c] और g :: [a] -> [c] का तर्क, अगला

f [] y = y 
f (x:xs) y = f xs (rc x y) 

पहला तर्क एक सूची है, और कहा कि अगर खाली है, परिणाम है इसलिए

rh :: ([a] -> [c]) -> c 

दूसरा तर्क, इसलिए f :: [a] -> b -> b पहले समीकरण से आता है।अब, दूसरे समीकरण में, आरएचएस पर, f का दूसरा तर्क rc x y है, इसलिए rc x y में y जैसा ही होना चाहिए, हमने b कहा था। लेकिन

rc :: a -> ([a] -> d) -> [a] -> d 

, तो b = [a] -> d। इसलिए

f :: [a] -> ([a] -> d) -> [a] -> d 

अंत में

g [] y = y 
g (x:xs) y = g xs (x:y) 

पहले समीकरण से हम g :: [a] -> b -> b अनुमान। दूसरे से, हम b = [a] निकालना, क्योंकि हम g के पहले तर्क और यह विपक्ष दूसरे के सिर ले, इस प्रकार

g :: [a] -> [a] -> [a] 
+0

धन्यवाद डैनियल! पहले समीकरण, आरसी के साथ, हम जी को लागू करते हैं जिसे हमने टाइप [ए] के रूप में पहचाना है - लेकिन हम कैसे जानते हैं कि फ़ंक्शन का आउटपुट टाइप डी है? क्या यह सिर्फ आरसी का उत्पादन नहीं है, और जरूरी नहीं कि जी का उत्पादन भी हो? – user1058210

+0

हम 'आरसी' की परिभाषा से' जी 'के परिणाम के बारे में कुछ भी नहीं जानते हैं, इसलिए जो भी पास किया गया है, वह गुजर तर्क' जी' का परिणाम प्रकार उस कॉल में 'आरसी' का परिणाम प्रकार है। उन प्रकारों के लिए जो कुछ भी हो सकते हैं, हम एक प्रकार चर का उपयोग करते हैं, चाहे हम इसे 'डी' या' सिमॉन 'कहते हैं, वह असमान है। यहां हमें इसे 'ए' नहीं कहना चाहिए, क्योंकि यह पहले से ही किसी अन्य प्रकार के लिए उपयोग किया जाता है (लेकिन 'g1 :: [b] -> b' को पास करने के लिए कानूनी है, प्रकार' d' 'a' के बराबर हो सकता है , लेकिन इसकी आवश्यकता नहीं है, इसलिए यह एक अलग संकेत मिलता है)। मैंने इसे 'd' छोड़ा क्योंकि यह 'आरसी' के प्रकार के पहले अनुमान में परिणाम प्रकार था। –

+0

यदि आरसी का परिणाम बस एक और जी समारोह है, तो आरसी के आउटपुट को [ए] -> डी के रूप में क्यों नहीं दिया जाता है? पूरी चीज बनाना: आरसी :: ए -> ([ए] -> डी) -> [ए] -> ([ए] -> डी) – user1058210

6

मैं प्रकार लिखने के लिए Haskell सिंटैक्स का उपयोग करने जा रहा हूँ। तो अपने प्रकार a -> b -> c -> d की तरह कुछ हो जाएगा

rc v g i = g (v:i) 

यहाँ rc तीन पैरामीटर लेता है,। v:iv और i, v :: a और i :: [a] के समान प्रकार के तत्वों की एक सूची होनी चाहिए। g उस सूची पर लागू होता है, ताकि g :: [a] -> d। यदि आप सभी को एक साथ रखते हैं, तो आपको rc :: a -> ([a] -> d) -> [a] -> d मिलते हैं।

जैसा कि आप पहले ही rn :: a -> a निकाल चुके हैं, क्योंकि यह केवल पहचान है।

मुझे फ़ंक्शन के प्रकार के बारे में कोई जानकारी नहीं है जिसका उपयोग आप rh में करते हैं, इसलिए मैं इसे छोड़ दूंगा।

f [] y = y 
f (x:xs) y = f xs (rc x y) 

यहाँ f दो पैरामीटर लेता है, तो उसके प्रकार a -> b -> c की तरह कुछ हो जाएगा। पहले मामले से हम b == c को घटा सकते हैं, क्योंकि हम y लौटते हैं, और पहला तर्क एक सूची है। अब के लिए हम जानते हैं कि f :: [a'] -> b -> b। दूसरे मामले नोटिस कैसे x और yrc के लिए इनपुट में दिया जाता है में: (क्योंकि यह रूप में f का यह दूसरा तर्क पारित कर दिया है, कि y के प्रकार भी होना चाहिए) y एक समारोह [a'] -> d, और rc x y :: a' -> d होना चाहिए। अंत में, हम कह सकते हैं कि f :: [a'] -> ([a'] -> d) -> ([a'] -> d)। चूंकि -> सही-सहयोगी है, यह [a'] -> ([a'] -> d) -> [a'] -> d के बराबर है।

आप शेष लोगों के लिए उसी तरीके से तर्क कर सकते हैं।

+0

'एचडी' मिरांडा मानक पुस्तकालय से है। यह हास्केल में 'हेड' के बराबर है, इसलिए इसका प्रकार '[ए] -> ए' है। – hammar

+0

धन्यवाद रिकार्डो! क्या आप इस सवाल पर नज़र डाल सकते हैं कि मैंने डैनियल से पूछा है क्योंकि यह आपके उत्तर पर भी लागू होता है - धन्यवाद! – user1058210

+0

खुशी। मुझे खेद है, मैं देर से पहुंचे। उसने पहले ही आपको समझाया :) –

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