运行时/动态单例类型

时间:2015-04-02 15:09:07

标签: json haskell singleton-type

$(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请求 - WinDrawWinOverUnder。我很容易使用ToJSON上的fromSing和我的ToJSON实例创建上述所有类型的MarketType实例,但我不确定最佳方法(如果有一个)创建相关的FromJSON实例。

我是否应该拥有看起来像这样的代码(所有类型'MarketType的单个实例)

instance FromJSON (SMarketType mt) where
    parseJSON = undefined

或者这个(每个单独的单独实例)

instance FromJSON (SMarketType WinDrawWin) where
    parseJSON = undefined

或者我应该为FromJSON类型使用MarketType个实例,然后执行某些操作来恢复price中所需的单例类型?

我知道toSing但是如果这就是我需要的话,我很想知道如何正确使用它。

0 个答案:

没有答案