如何在计算列表时输出值?

时间:2013-01-06 11:39:33

标签: haskell frp

我有一个长时间运行的计算输出列表。我想在计算它们时输出此列表中的值。这样做的方法是什么?

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

此外,在某些时候,我想将命令行输出转换为交互式可视化。我怎么能把我的名单变成像FRP的一系列事件?能够将其作为事件源插入现有的GUI框架中会很棒。

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

1 个答案:

答案 0 :(得分:6)

这是iteratees和iteratees(如库)的工作。

使用Proxy库。

import Control.Proxy

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

<processing>是您需要进行的额外计算。

类似问题:lazy version of mapMIs 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]
相关问题