2011-12-15 13 views
12

न्यू हास्केल के लिए खेद है अगर यह बहुत ही बुनियादी हैसमारोह के प्रकार से समारोह व्यवहार का निर्धारण करने

इस उदाहरण "असली दुनिया हास्केल" से लिया जाता है -

ghci> :type fst 
fst :: (a, b) -> a 

वे के प्रकार को दिखाने fst समारोह और उसके बाद इस पैरा के साथ इसे का पालन ...

"fst का परिणाम प्रकार a है। हम पहले से ही उल्लेख किया है कि पैरामीट्रिक पोलिमोर्फ़िज्मके आर बनाता है eal प्रकार दुर्गम: fst प्रकार a के एक मूल्य के निर्माण के लिए पर्याप्त जानकारी नहीं है, न ही यह एक b में एक a बदल सकते हैं। तो एकमात्र संभावित वैध व्यवहार (असीमित लूप या क्रैश को छोड़कर) यह हो सकता है कि जोड़ी के पहले तत्व को वापस कर दिया जाए। "

मुझे लगता है कि मुझे पैराग्राफ का मौलिक बिंदु याद आ रहा है, और शायद हास्केल के बारे में कुछ महत्वपूर्ण है । क्यों fst समारोह वापसी प्रकार b? यह एक परम के रूप में टपल क्यों नहीं ले सकता है, लेकिन केवल एक Int (या किसी अन्य प्रकार है कि a नहीं है) वापस नहीं? मैं क्यों समझ में नहीं आता सकता है इसे वापस a?

धन्यवाद

उत्तर

24

यदि यह उन चीजों में से कोई भी किया गया है, तो इसका प्रकार बदल जाएगा। उद्धरण क्या कह रहा है कि, हमें पता है कि fst(a, b) -> a प्रकार है, हम इसके बारे में उन कटौती कर सकते हैं। यदि इसका एक अलग प्रकार था, तो हम ऐसा करने में सक्षम नहीं होंगे।

उदाहरण के लिए, कि

snd :: (a, b) -> a 
snd (x, y) = y 

टाइप की जांच नहीं करता है देखते हैं, और इसलिए हम प्रकार (a, b) -> a के एक मूल्य snd की तरह व्यवहार नहीं कर सकते पता है।

Parametricity मूल रूप से तथ्य यह है कि एक खास प्रकार के एक बहुरूपी समारोह निर्माण से कुछ कानूनों का पालन करना चाहिए है - यानी, वहाँ उस प्रकार है कि उन्हें आज्ञा का पालन नहीं करता है की कोई अच्छी तरह से टाइप अभिव्यक्ति है। इसलिए, इसके साथ fst के बारे में चीजों को साबित करना संभव है, हमें पहले fst के प्रकार को जानना चाहिए।

नोट विशेष रूप से पॉलीमोर्फिज्म शब्द: हम गैर-पॉलिमॉर्फिक प्रकारों के बारे में समान कटौती नहीं कर सकते हैं। उदाहरण के लिए,

myFst :: (Int, String) -> Int 
myFst (a, b) = a 

प्रकार-जांच करता है, लेकिन इतना

myFst :: (Int, String) -> Int 
myFst (a, b) = 42 

और यहां तक ​​कि

myFst :: (Int, String) -> Int 
myFst (a, b) = length b 

Parametricity तथ्य यह है कि एक बहुरूपी समारोह में नहीं "देखो" कर सकते हैं पर निर्भर करता है महत्वपूर्ण करता है जिन प्रकारों के साथ इसे बुलाया जाता है।तो का एकमात्र मान fst जानता है कि यह दिया गया है: ट्यूपल का पहला तत्व।

2

यहां बिंदु यह है कि a और b दोनों प्रकार के चर हैं (जो एक जैसा हो सकता है, लेकिन इसकी आवश्यकता नहीं है)। वैसे भी, चूंकि दो तत्वों के दिए गए टुपल के लिए, fst हमेशा पहला तत्व देता है, लौटा हुआ प्रकार हमेशा पहले तत्व के प्रकार के समान होना चाहिए।

5

बिंदु यह है कि एक बार जब आप उस प्रकार के होते हैं, तो कार्यान्वयन विकल्प बहुत सीमित होते हैं। यदि आपने Int वापस कर दिया है, तो आपका प्रकार (a,b) -> Int होगा। चूंकि a कुछ भी हो सकता है, हम undefined का उपयोग किए बिना कार्यान्वयन में पतली हवा से बाहर नहीं जा सकते हैं, और इसलिए हमें कॉलर द्वारा दिए गए एक को वापस करना होगा।

4

आपको Theorems for Free आलेख पढ़ना चाहिए।

+11

आरडब्ल्यूएच के अध्याय 2 को खत्म करने से पहले? – ehird

+1

यह एक निशुल्क लेख है, हाहाहा –

+1

@ehird वह गहराई से स्पष्टीकरण चाहता था, तो यहां यह है। अन्य लोगों द्वारा बेसिक हैंड-वेविंग स्पष्टीकरण पहले ही दिया जा चुका है – nponeccop

3

आइए पहले से ही रियल वर्ल्ड हास्केल द्वारा दी गई कुछ और हाथ-लहराते जोड़ने का प्रयास करें। चलो अपने आप को समझा दिया है कि यह देखते हुए कि हम प्रकार (a,b) -> a केवल कुल समारोह में यह हो सकता है के साथ एक समारोह fst है कोशिश पीछा कर रहा है एक:

fst (x,y) = x 

सबसे पहले, हम और कुछ तो प्रकार a का मान प्रदान नहीं कर सकते , यह आधार है कि fst में (a,b) -> a है, इसलिए हमारे पास fst (x,y) = y या fst (x,y) = 1 नहीं हो सकता है क्योंकि इसमें सही प्रकार नहीं है।

अब

, के रूप में आरडब्ल्यूएच का कहना है कि अगर मैं fst एक (Int,Int) देते हैं, fst पता नहीं है इन Ints, इसके अलावा, a या b तो fst के साथ जुड़े उपलब्ध मूल्यों या कार्य करता है किसी भी प्रकार के वर्ग के हैं की आवश्यकता नहीं है कर रहे हैं a या b

तो fst केवल a मूल्य और b मूल्य है कि मैं इसे देने के बारे में जानता है और मैं एक a में b चालू नहीं कर सकता (यह एक b -> a समारोह नहीं कर सकते हैं) तो यह दिया a मान लौटाना चाहिए।

यह वास्तव में केवल जादुई हाथ सेविंग नहीं है, कोई वास्तव में किसी दिए गए बहुलक प्रकार के संभावित अभिव्यक्तियों को कम कर सकता है। वास्तव में djinn नामक एक प्रोग्राम है जो वास्तव में करता है।

+0

फॉलोअप के लिए धन्यवाद। एक और महान जवाब। – user772110

2

मौलिक बात आप शायद भूल रहे हैं यह है:

  • सबसे प्रोग्रामिंग भाषाओं में, यदि आप कहते हैं कि "इस समारोह किसी भी प्रकार के रिटर्न", इसका मतलब है समारोह तय कर सकते हैं कि किस प्रकार मूल्य वास्तव में लौटता है।

  • हास्केल में, यदि आप कहते हैं कि "इस समारोह किसी भी प्रकार के रिटर्न", इसका मतलब है कि फोन करने वाले तय करने के लिए किस प्रकार का होना चाहिए कि हो जाता है। (!)

तो अगर मैं तुम्हें foo :: Int -> x बारे में, यह सिर्फ एक String वापस नहीं लौट सकते, क्योंकि मैं इसे एक String के लिए नहीं पूछ सकते हैं।मैं Customer, या ThreadId, या कुछ भी के लिए पूछ सकता हूं।

जाहिर है, foo कोई भी तरीका नहीं है कि प्रत्येक संभावित प्रकार का मूल्य कैसे बनाया जाए, यहां तक ​​कि ऐसे प्रकार भी जो अभी तक मौजूद नहीं हैं। संक्षेप में, foo लिखना असंभव है। जो कुछ भी आप कोशिश करते हैं वह आपको त्रुटियों को टाइप करेगा, और संकलित नहीं करेगा।

(चेतावनी: वहाँ एक तरह से यह करने के लिए है foo पाश सकता है हमेशा के लिए, या एक अपवाद फेंक लेकिन यह नहीं कर सकते हैं वापसी कोई मान्य मान।।।)

एक समारोह होने के लिए कोई तरीका नहीं है किसी भी संभावित प्रकार के मूल्य बनाने में सक्षम। लेकिन यह पूरी तरह से संभव है किसी फ़ंक्शन के लिए डेटा को स्थानांतरित करने के लिए बिना किसी प्रकार के डेटा को स्थानांतरित करने के लिए। इसलिए, यदि आप कोई ऐसा फ़ंक्शन देखते हैं जो किसी भी प्रकार के डेटा को स्वीकार करता है, तो केवल एक चीज जो इसके साथ कर सकती है वह इसे चारों ओर ले जाना है।

वैकल्पिक रूप से, यदि प्रकार किसी विशिष्ट वर्ग से संबंधित है, तो फ़ंक्शन उस वर्ग के तरीकों का उपयोग कर सकता है। (सका। यह करने के लिए नहीं है, लेकिन यह अगर कर सकते हैं यह करना चाहता है।)

मूल रूप से, यही कारण है कि आप वास्तव में क्या एक समारोह करता है बस इसके प्रकार हस्ताक्षर को देखकर बता सकते हैं। प्रकार हस्ताक्षर आपको बताता है कि यह कार्य किस डेटा को दिया जा रहा है, उसके बारे में "जानता है" क्या है, और इसलिए यह संभवतः कौन से संभावित संचालन कर सकता है। यही कारण है कि अपने प्रकार के हस्ताक्षर से एक हास्केल फ़ंक्शन की खोज करना इतना शापित है।

आपने अभिव्यक्ति को सुना है "हास्केल में, अगर यह संकलित होता है, तो यह आमतौर पर सही काम करता है"? खैर, यही कारण है कि। ;-)

+0

यह पैरामीट्रिकिटी के पीछे विचारों का एक उत्कृष्ट स्पष्टीकरण है! अब हमें "प्रमेयर्स फॉर फ्री" में वैडलर के सबूत के समान समझने योग्य अनुवाद की आवश्यकता है। – dfeuer

+0

@dfeuer यदि आपको कोई मिलता है, तो मुझे बताएं! मैं उस वाक्यांश को देखता रहता हूं, लेकिन इसका कोई मतलब नहीं है इसका मतलब क्या है ... – MathematicalOrchid

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