什麼是Haskell的Stream Fusion,我該如何使用它?什麼是Haskell的Stream Fusion
回答
Logan指出的文章很棒,但有點困難。 (只問我的學生。)關於「流融合如何工作」以及只有一小部分「流融合是什麼以及如何使用它」這也很重要。
該流的融合解決的問題是,功能碼書面經常分配中間的列表,如創建節點數的無限列表,你可以寫
nodenames = map ("n"++) $ map show [1..]
天真的代碼將分配的無限名單整數[1, 2, 3, ...]
,字符串的無限列表["1", "2", "3", ...]
,最後是無限名字列表["n1", "n2", "n3", ...]
。這是太多的分配。
什麼流融合沒有將像nodenames
這樣的定義翻譯成某種使用遞歸函數的方法,該函數僅分配結果所需的內容。通常,取消中間名單的分配稱爲森林砍伐。
要使用流融合,你需要寫非遞歸列表功能使用該功能從GHC ticket 915描述的流融合庫(map
,foldr
,等等),而不是明確的遞歸。這個庫包含所有Prelude函數的新版本,這些函數已被重寫以利用流聚合。顯然這個東西將被定爲下一個GHC版本(6.12),但不在當前的穩定版本(6.10)。如果你想使用庫Porges在他的答案中有一個很好的簡單解釋。
如果你真的想要解釋流融合是如何工作的,請發表另外一個問題---但這很難。
據我所知,與諾曼所說的相反,流融合是而不是目前在GHC的基礎上實現(也就是說,你不能只使用前奏功能)。欲瞭解更多信息,請參閱GHC ticket 915。
要使用流融合,您需要安裝流融合庫,導入Data.List.Stream(您也可以導入Control.Monad.Stream),並且只使用該模塊中的函數而不是Prelude函數。這意味着導入隱藏所有默認列表函數的Prelude,而不是使用[x..y]結構或列表理解。
這是不是正確的,當6.12中的GHC默認使用這些新函數時,它們也將以非遞歸方式實現[x..y]和列表推導?因爲他們不是正確的行的唯一原因是他們內部並沒有真正寫在Haskell,但更像是關鍵字,出於速度和/或因爲你將無法重新定義該語法。
- 1. boost :: fusion的目的是什麼?
- 2. 是什麼()在Haskell
- 3. Haskell的擴展是什麼?
- 4. 什麼是scala Stream中的#::運算符?
- 5. Java8的Stream究竟是什麼?
- 6. 是什麼。在Haskell中做什麼?
- 7. 這是什麼Haskell語法?
- 8. 什麼是Haskell`( - >)a` monad?
- 9. 什麼是產生在Haskell
- 10. Haskell - 什麼是Control.Applicative.Alternative對嗎?
- 11. Fusion日誌說什麼?
- 12. Haskell中的ConcurrentHashMap的模擬是什麼?
- 13. Haskell的主要特性是什麼?
- 14. 什麼是Haskell中的嵌套模式?
- 15. Haskell中的非確定性是什麼?
- 16. 什麼是與Haskell「readFile」等效的Frege?
- 17. Haskell中的':'是什麼意思?
- 18. 什麼是Haskell中的「::」等價函數?
- 19. Haskell Prelude中'const'的含義是什麼?
- 20. Haskell的定義是什麼意思?
- 21. ++和:haskell之間的區別是什麼?
- 22. Haskell中的(:=)是什麼意思?
- 23. 「ls」在Haskell中的含義是什麼?
- 24. Haskell中的實例是什麼意思?
- 25. haskell中的「&」是什麼意思?
- 26. Haskell中的showS詭計是什麼?
- 27. Haskell中「fac」的含義是什麼?
- 28. 什麼是接口的haskell等價物?
- 29. Haskell - 什麼是過時的函數
- 30. Haskell中「〜」的含義是什麼?
有什麼,你需要知道哪些不是已經在[這篇文章](http://www.randomhacks.net/articles/2007/02/10/map-fusion-and-haskell-performance「地圖融合:讓Haskell快225%「)?如果是這樣,你能更具體嗎? – 2009-02-23 15:46:51
相關:http://lambda.jstolarek.com/2013/04/haskell-as-fast-as-ca-case-study/ – 2015-10-21 14:01:25