के बीच कनवर्ट करने का अच्छा तरीका मैं सोच रहा हूं कि विज्ञापन-हाक पॉलीमोर्फिक फ़ंक्शंस और पैरामीट्रिक पॉलिमॉर्फिक वाले लोगों के बीच कनवर्ट करने के सामान्य तरीके हैं या नहीं। दूसरे शब्दों में, एक विज्ञापन-पॉलीमोर्फिक फ़ंक्शन दिया गया है, इसके पैरामीट्रिक समकक्ष को कैसे कार्यान्वित किया जाए? और दूसरी तरफ के बारे में क्या?एड-होक पॉलीमोर्फिक फ़ंक्शंस और पैरामीट्रिक पॉलिमॉर्फिक वाले
उदाहरण के रूप में sort
लें। यह sortBy
के मामले में sort :: Ord a => [a] -> [a]
लिखने के लिए आसान है:
sort :: Ord a => [a] -> [a]
sort = sortBy compare
लेकिन दूसरी तरह के आसपास मुश्किल लगता है, अब तक सबसे अच्छा मैं कर सकता है एक सा "वस्तु उन्मुख" जाने के लिए है:
import qualified Data.List as L
data OrdVal a = OV (a -> a -> Ordering) a
instance Eq (OrdVal a) where
(OV cmp a) == (OV _ b) = a `cmp` b == EQ
instance Ord (OrdVal a) where
(OV cmp a) `compare` (OV _ b) = a `cmp` b
sortBy :: (a -> a -> Ordering) -> [a] -> [a]
sortBy cmp = map unOV . L.sort . map (OV cmp)
where
unOV (OV _ v) = v
लेकिन यह उचित समाधान की तुलना में एक हैक की तरह लगता है।
तो मैं जानना चाहते हैं:
- इस विशिष्ट उदाहरण के लिए बेहतर तरीके देखते हैं?
- विज्ञापन-पॉलीमोरिमिक फ़ंक्शंस और पैरामीट्रिक वाले लोगों के बीच कनवर्ट करने के लिए सामान्य तकनीक क्या हैं?
यदि हम शब्दकोशों को पारित कर सकते हैं (उदा। एग्डा implicits में), यह मामूली होगा। हालांकि, मेरा मानना है कि कुछ वर्ग/पुस्तकालय इस तथ्य का फायदा उठाते हैं कि हम कुछ आविष्कार सुनिश्चित करने के लिए शब्दकोशों को पास नहीं कर सकते हैं। उदाहरण के लिए, कल्पना करें कि क्या हम हर समय एक अलग ऑर्डरिंग का उपयोग करके'डेटा.नेट.इन्सर्ट 'को कॉल कर सकते हैं ... – chi
यह भी ध्यान रखें कि आपका "हैक" अभ्यास में काम करता है, लेकिन केवल तभी जब आप दो अलग-अलग' cmp' फ़ंक्शंस ' OrdVal एक मूल्य। यदि आप करते हैं, तो आपका 'ऑर्ड' उदाहरण 'ऑर्ड' कानूनों को पूरा नहीं करता है। – chi