haskell - 新型 HashMap 键的 FromJSON 实例

标签 haskell typeclass aeson

我做了一个新类型 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/

相关文章:

haskell - 有没有更好的方法来编写indexof函数?

haskell - 从 `Char` 获取 `ByteString`

OpenGL 旋转太敏感

haskell - 在 Haskell 中通过网络发送 10GB 向量的最佳方式

haskell - 您可以在类型类约束参数上对构造函数进行模式匹配吗?

json - Haskell Aeson : How to convert Value into custom type?

Haskell:类型类可以定义类型(ala 类型特征)

haskell - 理解嵌套 Monad 中的 Monadic 绑定(bind)

json - 将记录中的构造函数转换为 aeson haskell 中的自定义 json 字符串

haskell - AesonderiveJSON结合管道sinkParser