$(singletons [d|
data MarketType
= WinDrawWin
| OverUnder
deriving (Show, Generic)
|]
type family MarketIndex (mt :: MarketType) :: * where
MarketIndex 'OverUnder = Double
MarketIndex mt = ()
data Market (mt :: MarketType) = Market
{ marketType :: SMarketType mt -- ^ type of the market
, marketIndex :: MarketIndex mt -- ^ index of the market
}
price :: SMarketType mt -> MarketIndex mt -> Either String (Market mt)
price SWinDrawWin () = Right $ Market SWinDrawWin ()
price SOverUnder hcap = Right $ Market SOverUnder hcap
price mt mi = Left $ unwords [show (fromSing mt), show mi, "can't be priced"]
以上(简化)代码适用于所有类型都是预先知道的静态代码,但我想扩展它以便能够处理更多动态输入。例如,正在对一个特定市场定价的JSON请求 - WinDrawWin
或OverUnder
。我很容易使用ToJSON
上的fromSing
和我的ToJSON
实例创建上述所有类型的MarketType
实例,但我不确定最佳方法(如果有一个)创建相关的FromJSON
实例。
我是否应该拥有看起来像这样的代码(所有类型'MarketType
的单个实例)
instance FromJSON (SMarketType mt) where
parseJSON = undefined
或者这个(每个单独的单独实例)
instance FromJSON (SMarketType WinDrawWin) where
parseJSON = undefined
或者我应该为FromJSON
类型使用MarketType
个实例,然后执行某些操作来恢复price
中所需的单例类型?
我知道toSing
但是如果这就是我需要的话,我很想知道如何正确使用它。