
On Sat, Jul 9, 2011 at 6:45 PM, Tom Murphy
On 7/9/11, yi huang
wrote: I'm trying to create a haskell implementation of json rpc, I try to define protocol using record like this:
data Request = Request { version :: Integer , id :: Integer , method :: String , args :: [Value] } deriving (Typeable, Data, Show)
data Response = Response { version :: Integer , id :: Integer , code :: Integer , method :: String , result :: Value } deriving (Typeable, Data, Show)
so i can use json library to encode/decode it. But this code fails, because haskell will define access function automaticlly, and function names conflicts. My question is, is there a way i can define record without access function, so i can have same attribute name in multiple record.
If you don't want access functions defined, you can simply not name
your record fields:
data Request = Request Integer Integer String [Value]
deriving (Typeable, Data, Show)
If you want it to be more readable, you can define type synonyms:
type ID = Integer
type Version = Integer
[...]
data Request = Request Version ID Method Args
deriving (Typeable, Data, Show)
The two "instances" of ID won't conflict, then.
I have to define it as a record, so aeson can inspect the attribute names and encode it to a json object automatically, for example: "{\"args\":[],\"id\":1,\"method\":\"test\",\"version\":1}" But normal data constructor would be encoded to an array. Though i can define it as a normal data constructor, and implement ToJSON class manually, but the code would be more verbose.
Tom