我有興趣創建一個新的Haskell容器類型(嚴格列表),我想確保對它們的操作符合流融合的條件。如何選擇ghc的流融合功能?如何創建融合的Haskell容器?
如果我的容器是Traversable
,它會自動熔斷嗎?如果我以toList
的角度實現了mapAccumL
,那麼Haskell是否足夠聰明,根本不會將容器轉換爲List,而只是簡單地在底層表示上操作?
我有興趣創建一個新的Haskell容器類型(嚴格列表),我想確保對它們的操作符合流融合的條件。如何選擇ghc的流融合功能?如何創建融合的Haskell容器?
如果我的容器是Traversable
,它會自動熔斷嗎?如果我以toList
的角度實現了mapAccumL
,那麼Haskell是否足夠聰明,根本不會將容器轉換爲List,而只是簡單地在底層表示上操作?
GHC實際上並不聰明。這只是(好的)軟件。如果你希望你的新的東西融合,你有幾種選擇:
構建它的東西,已經融合了頂部:列出引信使用foldr/build
融合和載體引信使用流融合。如果你在其中一個上面建立你的類型,你可以安排它正確地融合而不會大驚小怪。如果您有選擇,這幾乎肯定是您的最佳選擇。
保險絲只是在接口上:即使你的類型沒有熔斷,你可能想要安排一定量的融合,當它被轉換爲或從列表或向量。
寫的融合規則自己:這是不是太硬的原則,但在實踐中,你會被衝擊你靠着牆頭,所以,除非你瘋了像我一樣,你可能希望避免使用此方法:你的規則不會在你想要的時候觸發,它們會以複雜的方式干擾其他規則,內聯將使你的行爲看起來很正常,而基準測試會顯示與你相反的東西想。
如果您想深入瞭解,請查看[流式融合論文](http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.104.7401)。 – luqui 2014-12-03 06:24:30
ghc不實現流聚合。它實現了foldr/build融合。主要區別在於連接只能通過摺疊/構建融合(儘管研究正在進行)來融合,而拉鍊只能通過銷燬/未摺疊融合(與流融合密切相關)融合。 – 2014-12-03 18:18:08