gpt4 book ai didi

haskell - 将 IO 回调转换为无限列表

转载 作者:行者123 更新时间:2023-12-02 14:55:56 25 4
gpt4 key购买 nike

我正在使用一个库,我可以提供一个函数 a -> IO (),它会偶尔调用。

因为我的函数的输出不仅取决于它作为输入接收的 a,而且还取决于之前的 a,所以对我来说会容易得多编写函数 [a] -> IO (),其中 [a] 是无限的。

我可以写一个函数吗:

magical :: ([a] -> IO ()) -> (a -> IO ())

收集从回调中接收到的 a 并将它们作为惰性无限列表传递给我的函数?

最佳答案

IORef 解决方案确实是最简单的解决方案。如果您想探索一个纯粹的(但更复杂的)变体,请查看 conduit .还有相同概念的其他实现,请参阅 Iteratee I/O ,但我发现自己 conduit 非常易于使用。

管道(又名管道)是可以接受输入和/或产生输出的程序的抽象。因此,如果需要,它可以保持内部状态。在您的情况下,magical 将是一个接收器,即接受某种类型的输入但不产生输出的管道。通过将其连接到一个生成输出的程序 source 中,您完成了管道,然后每当接收器请求输入时,source 就会运行,直到它生成输出。

在你的情况下,你会有大致类似的东西

magical :: Sink a IO () -- consumes a stream of `a`s, no result
magical = go (some initial state)
where
go state = do
m'input <- await
case m'input of
Nothing -> return () -- finish
Just input -> do
-- do something with the input
go (some updated state)

关于haskell - 将 IO 回调转换为无限列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52917139/

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