gpt4 book ai didi

Haskell:从Maybes 结构转换为Hashmap

转载 作者:行者123 更新时间:2023-12-04 08:41:36 25 4
gpt4 key购买 nike

我有一个经常出现的模式。我有一个这样的结构:

data Foo = Foo
{ foo :: Maybe Text
, bar :: Maybe Text
, buz :: Maybe Text
}
我想将它转换为带有标签值的 map ,丢弃 Nothing 值:
myMap :: [(Text, Text)]
例如: myMap = [("foo", "val1"), ("bar", "val2")]什么是最优雅的方式来做到这一点?
我尝试过诸如 if isJust ... then fromJust ... else Nothing 之类的模式然后使用 catMaybes但这不是很优雅的 IMO。
在实践中,我的结构更加异构:
data Foo = Foo
{ foo :: Maybe Text
, bar :: Maybe Bool
, buz :: Maybe Int
}
我想将其转换为:
myMap :: [(Text, Value)]
有镜头方式吗?

最佳答案

我们可以让 Haskell 自动派生 ToJson 的实例:

{-# LANGUAGE DeriveGeneric #-}

import Data.Text(Text)
import Data.Aeson(ToJSON)

import GHC.Generics(Generic)

data Foo = Foo
{ foo :: Maybe Text
, bar :: Maybe Bool
, buz :: Maybe Int
} deriving Generic

instance ToJSON Foo
然后,您可以过滤掉值为 Null 的项目。 :
import Data.Aeson(Value(Null, Object), toJSON)
import Data.HashMap.Strict(toList)

kvs :: Foo -> [(Text, Value)]
kvs foo
| Object obs <- toJSON foo = filter ((Null /=) . snd) (toList obs)
| otherwise = []
例如:
Prelude> kvs (Foo Nothing (Just True) (Just 14))
[("buz",Number 14.0),("bar",Bool True)]

关于Haskell:从Maybes 结构转换为Hashmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64543373/

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