2015-06-24 5 views
8

मैं हाल ही में एक ऐसी स्थिति में आया जहां मैं एक उदाहरण घोषणा में टाइप कन्स्ट्रक्टर लिखने में सक्षम होना चाहता था। मैं यह करने के पसंद आया होगा:रचनात्मक प्रकार जैसे रचनाकार

instance (SomeClass t, SomeClass t') => SomeClass (t . t') where 

(t . t') के साथ इस तरह (t . t') a = t (t' a) (ताकि t और t' तरह * -> * है कि परिभाषित हम आंशिक रूप से लागू कर सकते हैं प्रकार कंस्ट्रक्टर्स, कार्यों की तरह, तो क्या कारण है कि हम उन्हें रचना नहीं कर सकता है।? इसके अलावा, वहाँ शायद मैं क्या हासिल करने की कोशिश कर रहा था के लिए एक समाधान नहीं है शायद समानता बाधाओं के साथ

(मैं पता चलेगा कि Control.Compose मौजूद है, लेकिन यह केवल एक newtype आवरण बनाता है - मैं एक प्रकार पर्याय चाहते हैं)?।

उत्तर

10

(मुझे पता है कि Control.Compose मौजूद है, लेकिन यह केवल newtype रैपर बनाता है - मुझे एक प्रकार का समानार्थी चाहिए)।

हास्केल में इसकी अनुमति नहीं है। एक प्रकार का पर्याय पूर्ण रूप से लागू होना चाहिए: आप Compose t t', केवल Compose t t' a नहीं लिख सकते हैं।

आंशिक रूप से लागू प्रकार समानार्थियों को अनुमति देने से टाइप-लेवल लैम्ब्डा का कारण बनता है, जो टाइप अनुमान को अपरिहार्य बनाता है, इसलिए हास्केल में इसके लिए समर्थन की कमी है।


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

type Compose t t' a = t (t' a) 
data Proxy (k :: * -> *) = Proxy 

pr :: Proxy (Compose [] []) 
pr = Proxy 

परिणामों में (सभी प्रासंगिक GHC एक्सटेंशन सक्षम):

Type synonym ‘Compose’ should have 3 arguments, but has been given 2 
    In the type signature for ‘pr’: pr :: Proxy (Compose [] []) 

इसी तरह,

class C k where f :: k Int -> Int 
instance C (Compose [] []) where f _ = 6 

पैदावार:

लेकिन है कि यह केवल काम करता है क्योंकि पर्याय विस्तार के बाद हम (एक पूरी तरह से लागू प्रकार [] ([] Int) मिल

type T k = k Int 
type S = T (Compose [] []) 

bar :: S -> S 
bar = map (map succ) 

नोट:

Type synonym ‘Compose’ should have 3 arguments, but has been given 2 
    In the instance declaration for ‘C (Compose [] [])’ 

एक उदाहरण है जहाँ प्रकार पर्याय आंशिक आवेदन अनुमति है, बजाय (LiberalTypeSynonyms में सक्षम है) है यानी, [[Int]])। असल में, यह सुविधा कुछ भी करने की अनुमति नहीं देती है जो बिना किसी के कर सकता है, मैन्युअल रूप से समानार्थी का विस्तार कर सकता है।

+3

सच है, हालांकि '-XLiberalTypeSynonyms' आंशिक रूप से लागू प्रकार समानार्थी शब्दों को कुछ परिस्थितियों में अनुमति देता है। हालांकि, इस मामले में नहीं। – leftaroundabout

+0

महान जवाब! 'टाइप-लेवल लैम्बडास' वास्तव में अंतर्ज्ञान का प्रकार था जिसे मैं ढूंढ रहा था। – Alec

+1

प्रकार का स्तर टाइप स्तर लैम्बडा के साथ अपरिहार्य है। – augustss

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