我有一个长时间运行的计算输出列表.我想在计算它们时输出此列表中的值.这样做的方法是什么?
目前我用来mapM_ print
将每个值打印到STDOUT.这对于在命令行中打印值的简单情况来说效果很好,但感觉有点hacky并且难以使用.
此外,在某些时候,我想将命令行输出转换为交互式可视化.我怎么能把我的名单变成像FRP的一系列事件?能够将其作为事件源插入现有的GUI框架中会很棒.
重写函数以使用除列表之外的其他内容是一种选择,尽管允许我按原样获取列表的解决方案是理想的.
这是迭代器和迭代器(如库)的工作.
使用代理库.
import Control.Proxy
runProxy $ fromListS [1..10] >-> <processing> >-> printD >-> <more> processing>
Run Code Online (Sandbox Code Playgroud)
<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
Run Code Online (Sandbox Code Playgroud)
如果你颠倒了应用程序的顺序<-<
而不是>->
那么它看起来像普通的函数应用程序.
runProxy $ useD (labeledPrint "Second printer: ") <-< mapD (*2)
<-< printD
<-< fromListS [1..4]
Run Code Online (Sandbox Code Playgroud)