如何在Haskell中根据多个网络请求创建数据结构

埃迪克

我是Haskell的新手,所以对可能存在的愚蠢问题提前致歉。

我想构建一个数据结构,该数据结构是由应用程序中的两个http请求构建的。

我的第一个请求获得了用户的基本清单,我可以选择decodeMaybe [User]

 r <- getWith opts "https://www.example.com/users"
 let users = decode $ r ^. responseBody :: Maybe [User]

但是,如果我想通过为执行以下操作而做出响应的每个用户调用第二个端点来丰富我的用户数据,

r2 <- getWth opts "https://www.example.com/users/{userid}/addresses"
let enrichedUser = decode $ r2 ^. responseBody :: Maybe EnrichedUser

我暂时无法将这些部分拼凑在一起。我的do期望值是IO ()

任何帮助,将不胜感激!

卡尔·布尔

我假设的类型enrichedUser应该是Maybe EnrichedUser而不是Maybe [EnrichedUser],对吗?

如果是这样,则[User]从中提取列表后users :: Maybe [User],您面临的问题是针对每个 进行单调操作(以获取网页)User在此有一个方便的组合器Control.Monad

mapM :: (Monad m) => (a -> m b) -> ([a] -> m [b])

可以根据您的情况专门进行以下操作:

mapM :: (User -> IO EnrichedUser) -> ([User] -> IO [EnrichedUser])

这就是说,如果您知道如何编写一个接受a的函数User并创建一个将创建an的IO操作,则EnrichedUser可以mapM用来将其转换为接受一个列表[User]并创建一个IO操作以创建整个列表的函数[EnrichedUser]

在您的应用程序中,我想象以前的功能看起来像:

enrich :: User -> IO EnrichedUser
enrich u = do
    let opts = ...
    let url = "https://www.example.com/users/" 
              ++ userToUserID u ++ "/addresses"
    r2 <- getWith opts url
    let Just enrichedUser = decode $ r2 ^. responseBody
    return enrichedUser
  where decode = ...

然后您可以编写(在IO do-block中):

r <- getWith opts "https://www.example.com/users"
let Just users = decode $ r ^. responseBody
enrichedUsers <- mapM enrich users
-- here, enrichedUsers :: [EnrichedUser]
...etc...

Maybe为了简单起见,我在这里省略了处理。如果扩展失败,那么您可能仍想以某种方式将常规强制User为默认值EnrichedUser,因此您需要将enrich函数的底部修改为

let enrichedUser = case decode $ r2 ^. responseBody of
    Nothing -> defaultEnrichment u
    Just e  -> e
return enrichedUser

其他一切都将保持不变。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Haskell中为数据结构创建默认值

如何在NoSQL环境中创建以下数据结构

如何在Java中创建链接列表数据结构?

如何在JavaScript中创建数据结构?

如何在PHP中创建类似数据结构的集合?

如何在java中请求锁定数据结构的数据

如何在 Haskell 中使用数据结构?

如何创建数据结构?

如何组合多个字符串向量以在R中创建数据结构?

如何释放 Haskell 中特定数据结构的内存?

Haskell | 如何从深度嵌套的数据结构中获取值?

如何在hazelcast中创建共享数据结构的异步备份?

如何在Azure Key Vault中创建分层数据结构

如何在具有3个表的记录的Java中创建数据结构?

Haskell中的复杂数据结构

了解Haskell中的数据结构

在Haskell中编译大数据结构

如何在MATLAB中实现动态大小的数据结构?

如何在PowerShell中遍历JSON数据结构?

在C ++中,当在源文件中定义数据结构时,如何在头文件中声明数据结构?

如何在Java中创建三种不同类型的对象列表的笛卡尔积数据结构?

如何在所有内联类中创建数据结构模板(相同的.h文件)

如何在 Haskell 中将 S 表达式解析为数据结构?

如何在 Keras 网络中创建重复结构?

Haskell通用数据结构

如何在Kotlin中异步对多个项目执行网络请求?

在Java中创建类似结构的数据结构

如何在具有多个嵌套字段的数据结构中使用matlab ismember?

如何在Go中获取包含数据结构的结构的大小?