我做了一个新类型 UUID
在我的申请中代表 Text
编号。
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
...
newtype UUID =
UUID Text
deriving (Eq, Generic, FromJSON, ToJSON, FromField, ToField, FromText, Show, Read, Hashable)
我的应用程序需要一个 FromJSON
的实例对于 HashMap UUID a
. HashMap 为 HashMap Text a
定义了一个实例,有没有办法在定义我的时候使用它?
如果我必须重新定义实例,我会怎么写呢?这是来自 Data.Aeson.Types.Instances
的等价物:
instance (FromJSON v) => FromJSON (H.HashMap Text v) where
parseJSON = withObject "HashMap Text a" $ H.traverseWithKey (\k v -> parseJSON v <?> Key k)
你会如何为 UUID
写这个? Key
在哪里和 <?>
定义,我怎样才能自己轻松地查找它? Hoogle 似乎没有帮助。
最佳答案
你的 UUID
是一个新类型,所以你有
{-# LANGUAGE ScopedTypeVariables #-}
import Data.Coerce
-- other imports...
instance (FromJSON v) => FromJSON (HashMap UUID v) where
parseJSON = coerce (parseJSON :: Value -> Parser (HashMap Text v))
或者,也许更简单的方法
parseJSON = fmap (fromList . map (\(x,y) -> (UUID x,y)) . toList) . parseJSON
它简单地解析 Text HashMap,然后将其转换为 UUID 索引。但是,coerce
版本更好,因为它没有运行时成本。
关于haskell - 新型 HashMap 键的 FromJSON 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34318080/