我有一个长时间运行的计算输出列表。我想在计算它们时输出此列表中的值。这样做的方法是什么?
目前我使用mapM_ print
将每个值打印到STDOUT。这对于将值打印到命令行的简单情况非常有效,但是感觉有点hacky并且难以使用。
此外,在某些时候,我想将命令行输出转换为交互式可视化。我怎么能把我的名单变成像FRP的一系列事件?能够将其作为事件源插入现有的GUI框架中会很棒。
重写函数以使用除列表之外的其他内容是一种选择,尽管允许我按原样获取列表的解决方案是理想的。
答案 0 :(得分:6)
这是iteratees和iteratees(如库)的工作。
使用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]