haskell - 我应该如何从列表中输出计算值?

标签 haskell frp

我有一个输出列表的长时间运行的计算。我想在计算时从该列表中输出值。什么是一个巧妙的方法来做到这一点?

目前我使用mapM_ print将每个值打印到 STDOUT。这对于将值打印到命令行的简单情况来说足够好,但感觉有点hacky并且难以使用。

此外,在某些时候,我想将我的命令行输出转换为交互式可视化。我怎样才能将我的列表变成类似 FRP 的事件流?能够将其作为事件源插入现有的 GUI 框架会很棒。

重写函数以使用列表以外的东西是一种选择,尽管允许我按原样获取列表的解决方案是理想的。

最佳答案

这是迭代者和像库这样的迭代者的工作。

使用 Proxy图书馆。

import Control.Proxy

runProxy $ fromListS [1..10] >-> <processing> >-> printD >-> <more> processing>

在哪里 <processing>是您需要进行的加法计算。

类似问题:lazy version of mapM , Is Haskell's mapM not lazy?

例如:
> labeledPrint label x = putStrLn $ label ++ show x
> runProxy $ fromListS [1..4] >-> printD >-> mapD (*2) 
                              >-> useD (labeledPrint "Second printer: ")
1
Second printer: 2
2
Second printer: 4
3
Second printer: 6
4
Second printer: 8

如果你颠倒申请顺序并使用<-<而不是 >->然后它看起来像正常的功能应用程序。
runProxy $ useD (labeledPrint "Second printer: ") <-< mapD (*2)
                                                  <-< printD
                                                  <-< fromListS [1..4]

关于haskell - 我应该如何从列表中输出计算值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14181713/

相关文章:

haskell - 函数参数似乎在类型分析中消失了

haskell - 使用 gi-gtk 和 Reactive Banana 捕获 Haskell 异常

haskell - Haskell中 `data`和 `newtype`之间的区别

arrays - MArray 和 MVector 的统一接口(interface)

haskell - 此折叠实现中的错误

haskell - 创建/处理 Monad.State 列表?

javascript - Node.js 和 FRP(bacon.js) 中的原生 JS

javascript - bacon.js - 获取流/属性的值

haskell - 在回合制 ascii 游戏中使用 FRP(尤其是响应式(Reactive)香蕉)是否有意义?

haskell - 在函数式响应式(Reactive)编程中,如何在应用程序的两个部分之间共享状态?