我有一个输出列表的长时间运行的计算。我想在计算时从该列表中输出值。什么是一个巧妙的方法来做到这一点?
目前我使用mapM_ print
将每个值打印到 STDOUT。这对于将值打印到命令行的简单情况来说足够好,但感觉有点hacky并且难以使用。
此外,在某些时候,我想将我的命令行输出转换为交互式可视化。我怎样才能将我的列表变成类似 FRP 的事件流?能够将其作为事件源插入现有的 GUI 框架会很棒。
重写函数以使用列表以外的东西是一种选择,尽管允许我按原样获取列表的解决方案是理想的。
这是迭代者和像库这样的迭代者的工作。
使用代理库。
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]