6

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

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

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

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

4

1 回答 1

6

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

使用代理库。

import Control.Proxy

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

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

类似的问题: mapM 的懒惰版本Haskell 的 mapM 不懒惰吗?

例如:

> 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]
于 2013-01-06T16:43:35.243 回答