2015-02-08 3 views
1

Я хочу иметь общий тип, который может представлять любой класс в простой диаграмме классов. В этом случае класс содержит:Общий тип для классов OO в Haskell

  1. Имя
  2. любое количество аргументов любого типа
  3. Любое количество функций, которые принимает любое количество аргументов любого типа

У меня есть только использовал простые декларации ADT, которые не работают в этом случае, например, это то, за чем я застрял, но это не дает мне приближаться к типу гибкости, который я получаю после:

data Attr a = Attr { name :: String 
        , kind :: a} 
       deriving (Show) 

data Action = Action { name1 :: String 
        , params :: [Attr Int]} 
       deriving (Show) 

data Class a = NewC { name2 :: String 
        , attrs :: [Attr Int] 
        , actions :: [Action]} 
      deriving (Show) 

Итак, теперь мой вопрос заключается в том, как я могу представить любой произвольный класс в Haskell?

Я не хочу делать ООП в haskell. Imaging, что тип класса, который я пытаюсь сделать, будет узлом в графе. Однако каждый узел в графе будет другим классом.

+4

Зачем вы хотите это сделать? Каков ваш прецедент? Это похоже на проблему [xy] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –

+0

Вы хотите сделать ООП с уроками в Haskell, или вы хотите представлять в классах Haskell с другого языка? –

+0

Нет, я не хочу делать ООП в Хеккеле. Imaging, что тип класса, который я пытаюсь сделать, будет узлом в графе. – user3139545

ответ

2

Я думаю, что вы хотите представить диаграммы классов целиком как значения, а не сочетание значений и типов. Вместо Attr Int, например, вы можете использовать что-то вроде Attr { name="Int", kind=PrimitiveInt }. Я представил ниже OopType.

data Attr = Attr { name :: String 
        , kind :: OopType} 
       deriving (Show) 

data Action = Action { name1 :: String 
        , params :: [Attr]} 
       deriving (Show) 

data Class = NewC { name2 :: String 
        , attrs :: [Attr] 
        , actions :: [Action]} 
      deriving (Show) 

data OopType = ClassType Class 
      | InterfaceType Class -- TODO make a dedicated interface type 
      | Enum     -- TODO make a dedicated enum type 
      | PrimitiveString 
      | PrimitiveInt 

Обратите внимание, что это представление не моделирует «generics» (то есть классы, которые параметризуются типами). Для этого добавьте другое поле в тип класса.

Смежные вопросы