2013-01-06 68 views
6

我有一個長期運行的計算,輸出一個列表。我想在計算它們時從這個列表中輸出值。什麼將是一個乾淨的方式來做到這一點?我應該如何在計算時從列表中輸出值?

目前我使用mapM_ print將每個值打印到標準輸出。這對於將命令打印到命令行中的簡單情況來說已經足夠了,但感覺有點冒險並且很難處理。

此外,在某些時候,我想將我的命令行輸出轉換爲交互式可視化。我怎麼能把我的列表變成類似FRP事件的流?能夠將這個插入現有的GUI框架作爲事件的來源會很好。

重寫函數以使用除列表以外的其他東西是一種選擇,儘管允許我按照原樣使用列表的解決方案將是理想的選擇。

+0

由於Haskell中的列表很懶,'mapM_'也可以很好地與它們配合使用,所以我認爲默認的解決方案非常好。只需使用'hFlush stdout'來確保輸出真的被刷新(如'mapM_(hFlush stdout << print')。 –

回答

6

這是一個像庫一樣迭代和迭代的工作。

使用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] 
+1

如果你不想更改,你也可以使用'useD'而不是'mapMD'價值流向下游 –

+1

這是一個好主意,所以我在上面應用它。 – Davorak

相關問題