2011-02-07 9 views
21

मुझे पता है कि TypeSynomymInstances only allows fully applied type synonyms to be used in instance heads, लेकिन ऐसा लगता है कि यह आसान होगा अगर मैं उपयोग करने के लिए समान रूप से लागू प्रकार समानार्थी शब्द का उपयोग कर सकता हूं।टाइपसिंहम इंस्टेंस क्यों नहीं आंशिक रूप से लागू प्रकार समानार्थी उदाहरण उदाहरणों में उपयोग किए जाने की अनुमति देते हैं?

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

class Example e where 
    thingy :: a -> b -> e a b 

-- legit, but awkward 
newtype FuncWrapper e a b = FuncWrapper { ap :: a -> e a b } 
instance (Example e) => Example (FuncWrapper e) where 
    thingy _ = FuncWrapper . flip thingy 
funcWrapperUse :: (Example e) => e Int String 
funcWrapperUse = thingy 1 "two" `ap` 3 `ap` 4 `ap` 5 

-- not legal, but a little easier to use 
type FuncSynonym e a b = a -> e a b 
instance (Example e) => Example (FuncSynonym e) where 
    thingy _ = flip thingy 
funcSynonymUse :: (Example e) => e Int String 
funcSynonymUse = thingy 1 "two" 3 4 5 
+0

क्या आपने अपना दूसरा संस्करण चलाने के लिए '-XTypeSynonymInstances' को आजमाया है (जैसा कि जीएचसी द्वारा सुझाया गया है)? – Landei

+0

@ लैंडेल: यह इस तथ्य को पसंद नहीं करता कि 'FuncSynonym e' पूरी तरह से लागू नहीं है। इस प्रकार मेरा सवाल। – rampion

+1

यह टिकट (785] (http://ghc.haskell.org/trac/ghc/ticket/785) है, जिसे 'वोंटफ़िक्स' के रूप में चिह्नित किया गया है। –

उत्तर

28

आंशिक रूप से लागू किया प्रकार समानार्थी शब्द बिल्कुल हास्केल में अनुमति नहीं है। आंशिक रूप से लागू समानार्थी प्रभावी रूप से एक फ़ंक्शन है जिसका इनपुट गैर-लागू प्रकार हैं और जिसका आउटपुट एक प्रकार है।

type True x y = x 
type False x y = y 
type Not b x y = b y x 
type And b1 b2 x y = b1 (b2 x y) y 
type Or b1 b2 x y = b1 x (b2 x y) 

तय करने के लिए दो आंशिक रूप से लागू प्रकार समानार्थी शब्दों के बराबर हैं, चाहे प्रकार चेकर तय करने के लिए काम करता है के बराबर हैं होगा: उदाहरण के लिए, यहाँ बूलियन तर्क का एक एन्कोडिंग है। यह एक कठिन समस्या है, और सामान्य रूप से यह अपरिहार्य है।

+1

पर्याप्त मेला। मेरे उदाहरण में मैं इसका उपयोग एक साधारण प्रतिस्थापन के लिए करता हूं, इसलिए अगर यह अनुमति देने का कोई विकल्प होता तो यह अच्छा होगा, लेकिन फिर, मैं जीएचसी पर काम नहीं करता :)। धन्यवाद! – rampion

9

आंशिक रूप से लागू प्रकार समानार्थी की अनुमति देने के साथ एक और मुद्दा यह है कि वे टाइप अनुमान और उदाहरण चयन अनिवार्य रूप से असंभव बना देंगे। उदाहरण के लिए, मान लीजिए कि कुछ प्रोग्राम के संदर्भ में मैं thingyInt -> String -> Int -> (Int, String) पर उपयोग करना चाहता था। thingy टाइप forall a b e. a -> b -> e a b, इसलिए हम Int और bString साथ साथ a को एकजुट कर सकते हैं, लेकिन अगर e एक आंशिक रूप से लागू किया प्रकार पर्याय हो करने के लिए अनुमति दी है, हम

e = FuncSynonym (,) 

या

e = FuncSynonym' Int (,) where type FuncSynonym' x f a b = x -> f a b 

या यहाँ तक कि हो सकता था

e = Const2 (Int -> (Int, String)) where Const2 a x y = a 

प्रकार अनुमान की समस्या कार्यों की समानता तय करने से भी बदतर हो जाएगा; इसे किसी विशेष इनपुट, या इसी तरह की जटिल समस्याओं पर निर्दिष्ट आउटपुट के साथ सभी कार्यों पर विचार करने की आवश्यकता होगी (के साथ a b को एकजुट करने का प्रयास करें)।

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

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