मैं यह देखना चाहता हूं कि एक चीज़ को दूसरे में परिवर्तित करने के लिए एक प्रकार की कक्षा है और [(a,b)]
के मैपिंग से फिर से वापस लेना संभव है या नहीं।सामान्य रूपांतरण प्रकार वर्ग
इस उदाहरण को वर्णन करना चाहिए मुझे क्या करना चाहते हैं:
{-# LANGUAGE MultiParamTypeClasses #-}
import Data.Maybe(fromJust)
lk = flip lookup
flipPair = uncurry $ flip (,)
class (Eq a, Eq b) => Convert a b where
mapping :: [(a, b)]
mapping = error "No mapping defined"
convert :: a -> b
convert = fromJust . lk mapping
-- // This won't work:
instance (Convert a b) => Convert b a where
convert = fromJust . lk (map flipPair mapping)
यह के लिए दो उदाहरणों को परिभाषित करने के साथ ऐसा करना आसान है:
data XX = One | Two | Three deriving (Show, Eq)
data YY = Eno | Owt | Eerht deriving (Show, Eq)
instance Convert XX YY where
mapping = [(One, Eno), (Two, Owt), (Three, Eerht)]
-- // How can I make this work?:
main = do print $ (convert One :: YY) -- Want to output: Eno
print $ (convert Owt :: XX) -- Want to output: Two
यहाँ यह काम कर रही है पर मेरी वार है रूपांतरण किसी भी तरह से जा रहा है लेकिन मैं केवल पहले उदाहरण में घोषित करना चाहता हूं। कोई विचार है कि मैं यह कैसे कर सकता हूं?
संपादित करें: व्यवहार्य से मेरा मतलब है, क्या यह ओवरलैपिंग उदाहरणों के बिना किसी अन्य ग़लत एक्सटेंशन के किए जा सकता है?
सादगी के लिए, आप सभी 'LANGUAGE' pragmas को अल्पविराम से अलग सूची में जोड़ सकते हैं: '{- # LANGUAGE MultiParamTypeClasses, ... # -}'। –
@ एंटल एस-जेड: हाँ, अलग-अलग रेखाएं सिर्फ मेरी आदत है। मैं हास्केल के लिए एक काफी सरल संपादक का उपयोग करता हूं और कोड को दोबारा जोड़ने के दौरान प्रागमा को जोड़ना/निकालना आसान होता है यदि वे स्वयं निहित हैं। –
यह उचित है; मैंने कभी भी एक परियोजना में एक या दो से अधिक नहीं किया है, इसलिए उन्हें दोबारा सुधारना एक बड़ा मुद्दा नहीं रहा है। मैं लाभ देख सकता हूं, हालांकि, अब मैं इसके बारे में सोचता हूं। –