gpt4 book ai didi

haskell - 新型 HashMap 键的 FromJSON 实例

转载 作者:行者123 更新时间:2023-12-02 01:30:43 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com