user3139545
user3139545

Reputation: 7374

Generic type for OO classes in Haskell

I want to have a generic type that can represent any class in a simple class diagram. In this case a class contains:

  1. A name
  2. Any number of arguments of any type
  3. Any number of functions that takes any number of arguments of any type

I have only used simple ADT declarations which is not working in this case, for example this is what I have been stuck with but it gives me no where near the type of flexibility I'm after:

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)

So my question is now how would I go about representing any arbitrary class in Haskell?

I do not want to do OOP in haskell. Imaging that the class type I'm trying to make will be a node in a graph. However each node in the graph will be a different class.

Upvotes: 1

Views: 100

Answers (1)

GarethR
GarethR

Reputation: 724

I think you want to represent your class diagrams entirely as values rather than a mix of values and types. Instead of Attr Int, for example, you might use something like Attr { name="Int", kind=PrimitiveInt }. I've introduced an OopType type below.

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

Note that this representation doesn't model 'generics' (that is, classes that are parameterised by types). To do that, you'd add another field to the Class type.

Upvotes: 2

Related Questions