2009-02-23 40 views
60

什麼是Haskell的Stream Fusion,我該如何使用它?什麼是Haskell的Stream Fusion

+1

有什麼,你需要知道哪些不是已經在[這篇文章](http://www.randomhacks.net/articles/2007/02/10/map-fusion-and-haskell-performance「地圖融合:讓Haskell快225%「)?如果是這樣,你能更具體嗎? – 2009-02-23 15:46:51

+0

相關:http://lambda.jstolarek.com/2013/04/haskell-as-fast-as-ca-case-study/ – 2015-10-21 14:01:25

回答

60

Logan指出的文章很棒,但有點困難。 (只問我的學生。)關於「流融合如何工作」以及只有一小部分「流融合是什麼以及如何使用它」這也很重要。

該流的融合解決的問題是,功能碼書面經常分配中間的列表,如創建節點數的無限列表,你可以寫

nodenames = map ("n"++) $ map show [1..] 

天真的代碼將分配的無限名單整數[1, 2, 3, ...],字符串的無限列表["1", "2", "3", ...],最後是無限名字列表["n1", "n2", "n3", ...]。這是太多的分配。

什麼流融合沒有將像nodenames這樣的定義翻譯成某種使用遞歸函數的方法,該函數僅分配結果所需的內容。通常,取消中間名單的分配稱爲森林砍伐

要使用流融合,你需要寫非遞歸列表功能使用該功能從GHC ticket 915描述的流融合庫(mapfoldr,等等),而不是明確的遞歸。這個庫包含所有Prelude函數的新版本,這些函數已被重寫以利用流聚合。顯然這個東西將被定爲下一個GHC版本(6.12),但不在當前的穩定版本(6.10)。如果你想使用庫Porges在他的答案中有一個很好的簡單解釋。

如果你真的想要解釋流融合是如何工作的,請發表另外一個問題---但這很難。

12

據我所知,與諾曼所說的相反,流融合是而不是目前在GHC的基礎上實現(也就是說,你不能只使用前奏功能)。欲瞭解更多信息,請參閱GHC ticket 915

要使用流融合,您需要安裝流融合庫,導入Data.List.Stream(您也可以導入Control.Monad.Stream),並且只使用該模塊中的函數而不是Prelude函數。這意味着導入隱藏所有默認列表函數的Prelude,而不是使用[x..y]結構或列表理解。

-1

這是不是正確的,當6.12中的GHC默認使用這些新函數時,它們也將以非遞歸方式實現[x..y]和列表推導?因爲他們不是正確的行的唯一原因是他們內部並沒有真正寫在Haskell,但更像是關鍵字,出於速度和/或因爲你將無法重新定義該語法。