Haskell中OO类的通用类型

时间:2015-02-08 10:32:59

标签: haskell

我希望有一个泛型类型,可以表示简单类图中的任何类。在这种情况下,一个类包含:

  1. 姓名
  2. 任意类型的任意数量的参数
  3. 任意数量的任何类型的参数
  4. 我只使用了简单的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中做OOP。我尝试制作的类类型的图像将是图形中的节点。但是,图中的每个节点都是不同的类。

1 个答案:

答案 0 :(得分: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

请注意,此表示不会模拟“泛型”和“#”。 (即按类型参数化的类)。为此,您需要在类类型中添加另一个字段。