क्या मैं संकलक को समझ सकता हूं कि एक बाधा हमेशा बंद प्रकार के परिवार में समानार्थी शब्द से संतुष्ट होती है? परिवार को प्रचारित मूल्यों के एक सीमित सेट द्वारा अनुक्रमित किया जाता है।प्रतिबंधित बंद प्रकार परिवार
data NoShow = NoShow
data LiftedType = V1 | V2 | V3
type family (Show (Synonym (a :: LiftedType)) => Synonym (a :: LiftedType)) where
Synonym V1 = Int
Synonym V2 = NoShow -- no Show instance => compilation error
Synonym V3 =()
की तर्ज पर
कुछ मैं खुले प्रकार परिवारों पर एक बाधा को लागू कर सकते हैं:
class (Show (Synonym a)) => SynonymClass (a :: LiftedType) where
type Synonym a
type Synonym a =()
instance SynonymClass Int where
type Synonym V1 = Int
-- the compiler complains here
instance SynonymClass V2 where
type Synonym V2 = NoShow
instance SynonymClass V3
लेकिन संकलक तो होता तथ्य मौजूद है के बारे में तर्क करने में सक्षम होने की V1
, V2
और V3
के प्रत्येक के लिए SynonymClass a
का एक उदाहरण? लेकिन किसी भी मामले में, मैं एक खुले प्रकार के परिवार का उपयोग नहीं करना पसंद करूंगा।
इसकी आवश्यकता के लिए मेरी प्रेरणा यह है कि मैं संकलक को मनाने के लिए चाहता हूं कि मेरे कोड में एक बंद प्रकार के परिवार के सभी उदाहरणों को दिखाएं/पढ़ें उदाहरण हैं। एक सरलीकृत उदाहरण है:
parseLTandSynonym :: LiftedType -> String -> String
parseLTandSynonym lt x =
case (toSing lt) of
SomeSing (slt :: SLiftedType lt') -> parseSynonym slt x
parseSynonym :: forall lt. SLiftedType lt -> String -> String
parseSynonym slt flv =
case (readEither flv :: Either String (Synonym lt)) of
Left err -> "Can't parse synonym: " ++ err
Right x -> "Synonym value: " ++ show x
[किसी ने टिप्पणी है कि यह संभव नहीं है में उल्लेख किया है - यह है क्योंकि यह तकनीकी रूप से असंभव है है (और यदि हां, तो क्यों) या सिर्फ GHC कार्यान्वयन की एक सीमा?]
मुझे यह भी चाहिए था, लेकिन जहां तक मुझे पता है यह दुर्भाग्यपूर्ण नहीं है। मुझे लगता है कि सिंगलेट्स का उपयोग करते हुए आपको केवल 1 कक्षा की आवश्यकता है। – bennofs
क्यों न सिर्फ 'parseF :: forall lt। (पढ़ें (समानार्थी शब्द), दिखाएँ (समानार्थी शब्द)) => स्लीफ्टेड टाइप लेफ्टिनेंट -> स्ट्रिंग -> स्ट्रिंग'? यह आपके उद्देश्यों के लिए पर्याप्त है, क्योंकि मैं इसे समझता हूं। –
@ AndrásKovács मैंने अपने प्रेरक उदाहरण में कुछ और संदर्भ जोड़ा है। 'स्लिफ्टेड टाइप लेफ्टिन'' का मान सामने नहीं है - मैं '' (स्ट्रिंग, स्ट्रिंग) '' '' '(लिफ्टेड टाइप, स्ट्रिंग)' 'और फिर' '(स्लिफ्टेड टाइप लेफ्टिनेंट, समानार्थी lt) '', लेकिन 'कुछ' 'केस स्टेटमेंट में निर्भर रूप से टाइप किए गए भाग को छुपाएं। – dbeacham