2013-08-08 7 views
7

मैं हास्केल में एम्बेडेड भाषाओं के साथ काम कर रहा हूं। मेरी भाषाओं को स्रोत कोड के रूप में मुद्रित किया जा सकता है, इसलिए मैंने Compile कक्षा बनाई और प्रत्येक प्रोग्राम तत्व के लिए एक क्लास इंस्टेंस बनाया जिसे मुद्रित किया जा सकता है। इस तरह से मैं अपने कोड को रचनात्मक रूप से डंप कर सकता था। मोड की अवधारणाओं पर विचार करने से पहले यह ठीक काम करता था।हास्केल: उदाहरण के लिए अवैध प्रकार समानार्थी परिवार अनुप्रयोग

प्रत्येक भाषा का उपयोग दो मोड में किया जा सकता है (कक्षा Mode के उदाहरण के रूप में लागू)। सरल मोड में सबकुछ सामान्य है। नामित मोड में बहुत सारे प्रोग्राम तत्वों को स्ट्रिंग के साथ प्रतिस्थापित किया जा सकता है। (यह मैक्रो परिभाषाओं की तरह काम करता है।)

मैं सभी प्रतिनिधित्व प्रकार-सुरक्षित रखना चाहता हूं। तो विभिन्न languges या विभिन्न तरीकों के कार्यक्रम तत्व मिश्रित नहीं किया जा सकता है।

तो समस्या यह है कि मोड के बावजूद भाषाओं को कैसे डंप करना है?

{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances #-} 
class Compile a where 
    comp :: a -> String 

-- common elements in all languages 
data ElemA l m = ElemA (ElemB l m) 
data ElemB l m = ElemB 

class Lang l where 
    -- language-specific elements 
    data Instructions l :: * -> * 

-- common modes for all languages 
class Mode l m where 
    type MElemA l m :: * 
    type MElemB l m :: * 

-- mode with normal program elements 
data SimpleMode 
instance Mode l SimpleMode where 
    type MElemA l SimpleMode = ElemA l SimpleMode 
    type MElemB l SimpleMode = ElemB l SimpleMode 

-- a mode where each program element can be replaced with a string 
data NamedMode 
instance Mode l NamedMode where 
    type MElemA l NamedMode = Either String (ElemA l NamedMode) 
    type MElemB l NamedMode = Either String (ElemB l NamedMode) 

-- definition of Lang1 language 
data Lang1 
instance Lang Lang1 where 
    data Instructions Lang1 m 
    = Add (MElemA Lang1 m) (MElemA Lang1 m) (MElemA Lang1 m) 
    | Mul (MElemA Lang1 m) (MElemA Lang1 m) (MElemA Lang1 m) 
    -- | ... 

-- dumping the source code of Lang1 langauge 

-- ILLEGAL TYPE SYNONYM FAMILY APPLICATION HERE 
instance Compile (MElemA Lang1 m) where 
    comp _ = "A" 
-- AND HERE 
instance Compile (MElemB Lang1 m) where 
    comp _ = "B" 

मुझे पता है कि समानार्थी परिवार कक्षाओं के साथ अच्छी तरह से काम नहीं करते हैं, इसलिए मैं एक और समाधान ढूंढ रहा हूं।

संभावित समाधान मैं के बारे में पता कर रहा हूँ (लेकिन उपयोग करने के लिए नहीं करना चाहते हैं):

  • उपयोग कई के बजाय एक भी बहुरूपी comp समारोह कार्य करता है।
  • उपयोग केवल NamedMode प्रतिनिधित्व

उत्तर

3

मेरा एक दोस्त के लिए, ज़ोल्टन केलेमेन मुझे एक समाधान के लिए भेजा। उन्होंने एक निर्दिष्ट भाषा के प्रोग्राम तत्व को समाहित करने के लिए रैपर वर्गों का उपयोग किया। इस तरह उन्होंने उदाहरण के सिर से आवश्यक परिवार के अनुप्रयोगों को आवश्यकतानुसार अधिक ओवरहेड के बिना हटा दिया था।

मैं अन्य समाधान भी ढूंढ रहा हूं। यह अन्य प्रश्न के साथ समानता का उल्लेख के लिए

{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances, UndecidableInstances #-} 
class Compile a where 
    comp :: a -> String 

-- common elements in all languages 
data ElemA l m = ElemA (ElemB l m) 
data ElemB l m = ElemB 

class Lang l where 
    -- language-specific elements 
    data Instructions l :: * -> * 

-- wrapper classes for program elements of Lang1 
data Lang1A m = WrapperA (ElemA Lang1 m) 
data Lang1B m = WrapperB (ElemB Lang1 m) 

-- common modes for all languages 
class Mode l m where 
    type MElemA l m :: * 
    type MElemB l m :: * 

-- mode with normal program elements 
data SimpleMode 
instance Mode l SimpleMode where 
    type MElemA l SimpleMode = ElemA l SimpleMode 
    type MElemB l SimpleMode = ElemB l SimpleMode 

-- a mode where each program element can be replaced with a string 
data NamedMode 
instance Mode l NamedMode where 
    type MElemA l NamedMode = Either String (ElemA l NamedMode) 
    type MElemB l NamedMode = Either String (ElemB l NamedMode) 

-- definition of Lang1 language 
data Lang1 
instance Lang Lang1 where 
    data Instructions Lang1 m 
    = Add (MElemA Lang1 m) (MElemA Lang1 m) (MElemA Lang1 m) 
    | Mul (MElemA Lang1 m) (MElemA Lang1 m) (MElemA Lang1 m) 
    -- | ... 

-- dumping the source code of Lang1 langauge 

-- ILLEGAL TYPE SYNONYM FAMILY APPLICATION HERE 
instance Compile (Lang1A m) where 
    comp (WrapperA e) = "A" 
-- AND HERE 
instance Compile (Lang1B m) where 
    comp (WrapperB e) = "B" 
+0

भी धन्यवाद: http://stackoverflow.com/questions/2590495/problem-when-mixing-type-classes-and-type-families?rq=1 –

+0

सका डेटा के स्थान पर newtype का उपयोग किया है - नहीं? – lynnard

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