Я не уверен, что понимаю вопрос. Вот полный файл со стандартными реализациями:
{-# LANGUAGE DeriveGeneric #-}
module Q54178405 where
import Data.Text
import Data.Aeson
import GHC.Generics
type WorkspaceId = Int
type GoalId = Int
type GoalDescription = Text
data GoalStatus =
Created | Accomplished | InProgress | GivenUp deriving (Show, Eq, Generic)
instance ToJSON GoalStatus
instance FromJSON GoalStatus
data Goal = Goal {
workspaceId ::WorkspaceId
, goalId :: GoalId
, description :: GoalDescription
, status :: GoalStatus}
deriving (Show, Eq, Generic)
instance ToJSON Goal
instance FromJSON Goal
Вот как он ведет себя в GHCi:
*Q54178405 Q54178405> encode $ Goal 42 1337 "foo" Accomplished
"{\"status\":\"Accomplished\",\"goalId\":1337,\"workspaceId\":42,\"description\":\"foo\"}"
*Q54178405 Q54178405> encode $ Goal 42 1337 "foo" GivenUp
"{\"status\":\"GivenUp\",\"goalId\":1337,\"workspaceId\":42,\"description\":\"foo\"}"
Разве это не то, что вы хотите?
В обоих случаях также туда и обратно:
*Q54178405 Q54178405> decode $ encode $ Goal 42 1337 "foo" GivenUp :: Maybe Goal
Just (Goal {workspaceId = 42, goalId = 1337, description = "foo", status = GivenUp})
Если это не то, что вы хотите, было бы полезно с некоторыми явными примерами ввода с желаемым выводом.