2011-05-28 16 views
5

क्या कोई भी मुझे एल्गोरिदम सॉर्ट करने के संबंध में यह समझा सकता है?एक पैरामीट्रिकली पॉलिमॉर्फिक फ़ंक्शन क्या है?

+3

"खोज" से आपका क्या मतलब है? –

+0

पूर्णांक – Lunar

+2

के क्विकॉर्ट के संबंध में, संक्षेप में, यह एक [प्राकृतिक परिवर्तन] (http://en.wikipedia.org/wiki/Natural_transformation) है। लेकिन ऐसा कहकर यह केवल मामलों को जटिल बनाता है। –

उत्तर

7

मुझे सबसे सरल चीज़ की कोशिश करने दें।

मान लीजिए आप पूर्णांकों की एक जोड़ी है:

foo :: (Int, Int) 
foo = (2,5) 

और आप एक समारोह है कि कि जोड़ी पर पूर्णांकों की स्थिति स्वैप चाहते हैं। यह againt लागू करने के लिए

swapInt :: (Int, Int) -> (Int, Int) 
swapInt (x,y) = (y,x) 

लेकिन अब अगर आप Double रों के लिए एक समान कार्य की जरूरत है, आप होगा:: आप ऐसा कर सकता है

swapDouble :: (Double, Double) -> (Double, Double) 
swapDouble (x,y) = (y,x) 

आप चीजों के एक ध्यान देने योग्य कुछ है: (1) swapDouble और swapInt के कोड उनके प्रकार के हस्ताक्षर को छोड़कर समान हैं, (2) कोड में कहीं भी आप उस संदर्भ में कुछ भी संदर्भित नहीं करते हैं जो x और y के प्रकारों पर निर्भर करेगा। यह कोड मान्य है जो भी उनके प्रकार हैं। तो कोड को सिर्फ एक बार लिखने का एक तरीका होना चाहिए और संकलक को प्रत्येक प्रकार की आवश्यकता के लिए स्वचालित रूप से कोड को विशेषज्ञ बनाना चाहिए। ऐसा करने का तरीका पैरामीट्रिकल पॉलीमोर्फिज्म है। इस विशेष मामले के लिए, आप लिख सकते हैं:

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

इसका क्या अर्थ है? आप कंपाइलर को बता रहे हैं: एक फ़ंक्शन स्वैप है, जो एक जोड़ी (x, y) लेता है जहां x टाइप प्रकार ए और वाई प्रकार बी है, और जोड़ी (y, x) को वापस कर देता है। ए और बी किसी भी प्रकार का हो सकता है, इस प्रकार इस फ़ंक्शन को पॉलीमोर्फिक फ़ंक्शन कहा जाता है। जब आप किसी विशिष्ट जोड़ी पर swap लागू करते हैं, तो कंपाइलर इस जोड़ी के प्रकार की जांच करेगा और स्वचालित रूप से इस फ़ंक्शन के एक संस्करण को तुरंत चालू करेगा जो आपके टुपल के लिए पर्याप्त है।

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

swap ('a', 1) = (1,'a') -- in this case swap :: (Char, Int) -> (Int, Char) 
swap (0 , 5) = (5, 0) -- in this case swap :: (Int , Int) -> (Int, Int) 

का नाम समझते हैं: बहुरूपी किसी भी समारोह या डेटा संरचना है कि कई अलग अलग प्रकार के साथ काम करता है। पैरामीट्रिक कारण पॉलिमॉर्फिज्म को लागू करने का तरीका है फंक्शन या डेटा स्ट्रक्चर के प्रकार में "टाइप पैरामीटर" होना। जब आप (a,b) लिखते हैं, a और b टाइप पैरामीटर हैं।

कई डेटा संरचनाओं को तब भी लागू किया जा सकता है जब सूची में शामिल है: सूचियां, सरणी, मानचित्र, टुपल्स, ... उनमें से सभी को पैरामीट्रिकली पॉलिमॉर्फिक कार्यान्वयन हो सकता है। और उनके द्वारा संचालित कार्यों: क्रमबद्ध, मानचित्र, गुना, ... विशिष्ट प्रकारों को संदर्भित किए बिना लागू किया जा सकता है, लेकिन पैरामीटर टाइप करने के लिए जो संकलक द्वारा स्वचालित रूप से विशेषीकृत किया जाएगा।

अन्य प्रकार के बहुरूपता मौजूद हैं, और उदाहरण के लिए, हास्केल भी विज्ञापन पॉलिमॉर्फिज्म को लागू करता है।

2

पैरामैट्रिक पॉलिमॉर्फिज्म सामान्य रूप से एक फ़ंक्शन या डेटा प्रकार को लिखे जाने की अनुमति देता है, ताकि यह उनके प्रकार के आधार पर समान रूप से मूल्यों को संभाल सके। पैरामैट्रिक पॉलिमॉर्फिज्म एक भाषा को अधिक अभिव्यक्तिपूर्ण बनाने का एक तरीका है, जबकि अभी भी पूर्ण स्थैतिक प्रकार-सुरक्षा को बनाए रखना है।

- से: http://en.wikipedia.org/wiki/Polymorphism_(computer_science)।

खोजों के संबंध में, मुझे लगता है कि सटीक संदर्भ पर अधिक निर्भर करता है - मैं वहां मदद नहीं कर सकता।

+1

शायद मामला। सरल मामला 'id :: a -> a' है जो किसी भी प्रकार का मान हो सकता है, और उसी मान को लौटाता है (जो कि अभी भी वही प्रकार है)। बहुरूपता के बिना आपको सभी प्रकारों के लिए 'idInt :: Int -> Int'' idString :: स्ट्रिंग -> स्ट्रिंग' आदि घोषित करना होगा –

+0

सहमत हैं। ध्यान देने योग्य भी है, क्योंकि इसे भूलना आसान है। "पैरामीटर" का अर्थ केवल यह है कि फ़ंक्शन क्या करता है उसके दिए गए मानकों पर आधारित होता है। क्षमा करें अगर यह स्पष्ट है। – Adam

6

एक ऐसा फ़ंक्शन जो तर्क प्रकारों के लिए अज्ञेयवादी है, यह इसके साथ काम करता है।

linear_search f n [] = Nothing 
linear_search f n (x:xs) 
    | f n x  = Just x 
    | otherwise = linear_search f n xs 

मेरा हास्केल जंगली है, इसलिए अगर कोई टिप्पणी में गलतियों को सही कर सकता है तो इसकी सराहना की जाएगी।

यहां विचार यह है कि linear_search किसी भी प्रकार की सूची में एक रैखिक खोज को पूर्ववत कर सकता है; यह वही कार्य करता है जो फ़र्मेट्रिकली (फ़ंक्शन पैरामीटर का अर्थ है) पॉलिमॉर्फिक (क्योंकि वे कई प्रकार के हो सकते हैं)।

# preforming on integers 
linear_search (==) 5 [1,2,3,4,5] 
# returns Just 5 

# preforming on strings 
linear_search (elem) 'e' ["doctor", "apron", "horse", "sky"] 
# returns Just "horse" 

जब इस समारोह के प्रकार के बारे में बात कर, यह (a -> b -> Bool) -> a -> [b] -> Maybe b के रूप में कहा गया है। महत्वपूर्ण बात यह है कि अक्षरों प्रकार चर इंगित करते हैं, जिसका अर्थ है कि उनका प्रकार कुछ भी हो सकता है - फिर संपत्ति जो पैरामीट्रिकली पॉलिमॉर्फिक बनाती है।

+0

सबसे पहले, '(ए -> बी -> बूल) -> ए -> [बी] -> शायद बी' में एक गायब 'बी' है। दूसरा, यह 'बस एन' के बजाय 'बस x' होना चाहिए। – Rotsor

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