我希望有一个泛型类型,可以表示简单类图中的任何类。在这种情况下,一个类包含:
我只使用了简单的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。我尝试制作的类类型的图像将是图形中的节点。但是,图中的每个节点都是不同的类。
答案 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
请注意,此表示不会模拟“泛型”和“#”。 (即按类型参数化的类)。为此,您需要在类类型中添加另一个字段。