5

इस Combinator पर विचार करें:एक Combinator के प्रकार के हस्ताक्षर इसके समकक्ष लैम्ब्डा समारोह के प्रकार के हस्ताक्षर से मेल नहीं खाता

S (S K) 

तर्कों को लागू करें XY:

:

S (S K) X Y 

यह करने के लिए अनुबंध

X Y 

मैंने एस (एसके) को इसी लैम्ब्डा शर्तों में परिवर्तित कर दिया और परिणाम मिला:

(\x y -> x y) 

मैं (\ एक्स वाई -> एक्स वाई) के प्रकार के हस्ताक्षर प्राप्त करने के लिए हास्केल WinGHCi उपकरण का उपयोग किया है और यह दिखाई:

(t1 -> t) -> t1 -> t 

मेरे लिए समझ में आता है कि।

इसके बाद, मैं रों (रों ट) के प्रकार के हस्ताक्षर प्राप्त करने के लिए WinGHCi का इस्तेमाल किया और यह दिखाई:

((t -> t1) -> t) -> (t -> t1) -> t 

कि मेरे लिए कोई मतलब नहीं है। प्रकार हस्ताक्षर अलग क्यों हैं?

नोट: मैं एस, कश्मीर में परिभाषित किया गया है, और के रूप में मैं:

s = (\f g x -> f x (g x)) 
k = (\a x -> a) 
i = (\f -> f) 
+3

बाद वाला प्रकार पहले के जैसा ही है, बस कठोर है। क्या 'एक्स' और 'वाई' पर कोई बाधा है? – fuz

उत्तर

1

उन सभी के लिए धन्यवाद जिन्होंने मेरे प्रश्न का उत्तर दिया। मैंने आपके जवाबों का अध्ययन किया है। यह सुनिश्चित करने के लिए कि मैं समझता हूं कि मैंने जो सीखा है, मैंने अपने प्रश्न का अपना जवाब लिखा है। अगर मेरा जवाब सही नहीं है, तो कृपया मुझे बताएं।

हम k और s के प्रकार के साथ शुरू: (s k) के प्रकार के हस्ताक्षर determing पर

k :: t1 -> t2 -> t1 
    k = (\a x -> a) 

    s :: (t3 -> t4 -> t5) -> (t3 -> t4) -> t3 -> t5 
    s = (\f g x -> f x (g x)) 

चलो पहले काम करते हैं।

याद s की परिभाषा:

s = (\f g x -> f x (g x)) 

को स्थानापन्न (\f g x -> f x (g x)) करार में kf के लिए परिणाम:

(\g x -> k x (g x)) 

महत्वपूर्ण जी और एक्स के प्रकार k के अनुरूप होना चाहिए की हस्ताक्षर टाइप करें।

याद रखें कि k इस प्रकार के हस्ताक्षर होते हैं:

k :: t1 -> t2 -> t1 

तो, यह समारोह परिभाषा k x (g x) के लिए हमें अपने अनुमान कर सकते हैं:

  • x के प्रकार k के पहले तर्क के प्रकार है , जो t1 प्रकार है। इसलिए (g x) का परिणाम t2 होना चाहिए

  • k के दूसरे तर्क के प्रकार, t2 है।

  • g में x है जो हमारे तर्क के रूप में हमने पहले ही निर्धारित किया है कि t1 टाइप किया गया है। तो (g x) का प्रकार हस्ताक्षर (t1 -> t2) है।

  • k के परिणाम के प्रकार t1 है, इसलिए (s k) का परिणाम t1 है।

तो, (\g x -> k x (g x)) के प्रकार के हस्ताक्षर यह है:

(t1 -> t2) -> t1 -> t1 

इसके बाद, k हमेशा अपने पहले तर्क वापस जाने के लिए परिभाषित किया गया है।तो यह: यह करने के लिए

k x (g x) 

अनुबंध:

x 

और यह: यह करने के लिए

(\g x -> k x (g x)) 

अनुबंध:

(\g x -> x) 

ठीक है, अब हम बाहर (s k) लगा :

s k :: (t1 -> t2) -> t1 -> t1 
    s k = (\g x -> x) 

अब s (s k) के प्रकार हस्ताक्षर को निर्धारित करते हैं।

हम उसी तरह आगे बढ़ते हैं।

याद s की परिभाषा:

s = (\f g x -> f x (g x)) 

को स्थानापन्न (\f g x -> f x (g x)) करार में (s k)f के लिए परिणाम:

(\g x -> (s k) x (g x)) 

महत्वपूर्णg और x के प्रकार (s k) के अनुरूप होना चाहिए की हस्ताक्षर टाइप करें।

याद रखें कि (s k) इस प्रकार के हस्ताक्षर होते हैं:

s k :: (t1 -> t2) -> t1 -> t1 

तो, यह समारोह परिभाषा (s k) x (g x) के लिए हमें अपने अनुमान कर सकते हैं:

  • x के प्रकार (s k) के पहले तर्क के प्रकार है , जो (t1 -> t2) प्रकार है। इसलिए (g x) का परिणाम t1 होना चाहिए

  • (s k) के दूसरे तर्क के प्रकार, t1 है।

  • gx है जो इसके तर्क के रूप में है, जिसे हमने पहले ही निर्धारित कर लिया है (t1 -> t2) टाइप किया गया है। तो (g x) का प्रकार हस्ताक्षर ((t1 -> t2) -> t1) है।

  • (s k) के परिणाम के प्रकार t1 है, इसलिए s (s k) का परिणाम t1 है।

तो, (\g x -> (s k) x (g x)) के प्रकार के हस्ताक्षर यह है:

((t1 -> t2) -> t1) -> (t1 -> t2) -> t1 

इससे पहले हम निर्धारित s k इस परिभाषा है:

(\g x -> x) 

है यही कारण है कि, यह एक समारोह है कि दो लेता है तर्क और दूसरा लौटाता है।

इसलिए

, इस: यह करने के लिए

(s k) x (g x) 

संविदा:

(g x) 

और यह: यह करने के लिए

(\g x -> (s k) x (g x)) 

अनुबंध:

(\g x -> g x) 

ठीक है, अब हमने s (s k) का पता लगाया है।

s (s k) :: ((t1 -> t2) -> t1) -> (t1 -> t2) -> t1 
    s (s k) = (\g x -> g x) 

अन्त में, इस समारोह के प्रकार के हस्ताक्षर के साथ s (s k) के प्रकार के हस्ताक्षर की तुलना:

p = (\g x -> g x) 

p के प्रकार है:

p :: (t1 -> t) -> t1 -> t 

p और s (s k) एक ही परिभाषा है (\g x -> g x) तो उनके पास अलग-अलग प्रकार के हस्ताक्षर क्यों हैं?

s (s k) का कारण p से भिन्न प्रकार का हस्ताक्षर है कि p पर कोई बाधा नहीं है। हमने देखा कि s(s k) में k के प्रकार हस्ताक्षर के साथ संगत होने के लिए बाध्य है, और s (s k) में पहले s(s k) के प्रकार हस्ताक्षर के साथ संगत होने के लिए बाध्य है। इसलिए, s (s k) का प्रकार हस्ताक्षर इसके तर्क के कारण बाधित है। भले ही p और s (s k) में समान परिभाषा है g और x पर बाधाएं अलग-अलग हैं।

9

हम k के प्रकार के साथ शुरू करते हैं और s

k :: t1 -> t2 -> t1 
k = (\a x -> a) 

s :: (t3 -> t4 -> t5) -> (t3 -> t4) -> t3 -> t5 
s = (\f g x -> f x (g x)) 

तो s के पहले तर्क के रूप में k गुजर, हम k के प्रकार को s के पहले तर्क के साथ एकीकृत करें, और s का उपयोग

पर करें
s :: (t1 -> t2 -> t1) -> (t1 -> t2) -> t1 -> t1 

इसलिए हम

s k :: (t1 -> t2) -> t1 -> t1 
s k = (\g x -> k x (g x)) = (\g x -> x) 

फिर s (s k) में, बाहरी s प्रकार में प्रयोग किया जाता है (t3 = t1 -> t2, t4 = t5 = t1)

s :: ((t1 -> t2) -> t1 -> t1) -> ((t1 -> t2) -> t1) -> (t1 -> t2) -> t1 

लागू करने कि s k को पहले तर्क के प्रकार चला जाता है और प्राप्त हमें

s (s k) :: ((t1 -> t2) -> t1) -> (t1 -> t2) -> t1 
के साथ छोड़ देता है

सारांश के रूप में: हास्केल में, s (s k) का प्रकार इसके घटक उप-अभिव्यक्तियों के प्रकारों से लिया गया है, न कि इसके तर्क से इसके प्रभाव से। इसलिए इसमें लैम्ब्डा अभिव्यक्ति की तुलना में कम सामान्य प्रकार है जो s (s k) के प्रभाव को दर्शाता है।

7

आप जिस प्रकार का सिस्टम उपयोग कर रहे हैं वह मूल रूप से बस टाइप किए गए लैम्ब्डा कैलकुस के समान है (आप किसी भी पुनरावर्ती कार्यों या पुनरावर्ती प्रकारों का उपयोग नहीं कर रहे हैं)। बस टाइप किया गया लैम्ब्डा कैलकुलेशन पूरी तरह से सामान्य नहीं है; यह ट्यूरिंग-पूर्ण नहीं है, और इसका उपयोग सामान्य रिकर्सन लिखने के लिए नहीं किया जा सकता है।एसकेआई संयोजक कैलकुस ट्यूरिंग-पूर्ण है, और इसका उपयोग फिक्स्ड-पॉइंट कम्बिनेटर और सामान्य रिकर्सन लिखने के लिए किया जा सकता है; इसलिए, एसकेआई संयोजक कैलकुस की पूर्ण शक्ति को आसानी से टाइप किए गए लैम्ब्डा कैलकुस में व्यक्त नहीं किया जा सकता है (हालांकि यह बिना लम्बा कैलकुस में हो सकता है)।

+1

जानना महत्वपूर्ण है, अपरिहार्य प्रश्न दिया गया है "ओउ आओ हास्केल मुझे लिखने नहीं देगा?" लेकिन वास्तव में ओपी के सवाल का जवाब नहीं देता कि क्यों प्रकार अलग हैं। – luqui

+0

और जो भी आपको नीचे गिरा देता है उसे वास्तव में एक कारण देना चाहिए। बेनामी डाउनवॉट्स अच्छा नहीं है। – luqui