我最近了解到Data.Function.fix
,現在我想將它應用到任何地方。例如,每當我看到一個遞歸函數時,我想要「fix
」它。所以基本上我的問題是我應該在何時何地使用它。Haskell:修復或不修復
爲了使它更具體:
1)假設我有一個的n
分解如下代碼:
f n = f' n primes
where
f' n (p:ps) = ...
-- if p^2<=n: returns (p,k):f' (n `div` p^k) ps for k = maximum power of p in n
-- if n<=1: returns []
-- otherwise: returns [(n,1)]
如果我把它改寫在fix
而言,我將獲得什麼?失去什麼?是否有可能,通過重寫一個明確的遞歸到fix
-version我會解決或反之亦然創建堆棧溢出?
2)當處理列表時,有幾種解決方案:遞歸/修復,foldr/foldl/foldl',可能還有其他的。有什麼時候使用每一個的一般指導/建議?例如,你會重寫上面的代碼使用foldr
在素數的無限列表上嗎?
這裏可能還有其他重要的問題。任何與使用fix
有關的其他意見也是受歡迎的。
「_I最近了解到的數據.FUNC tion.fix,現在看來,我想將它應用到處。「這讓你成爲一名童子軍Haskell程序員,然後 - http://www.willamette.edu/~fruehr/haskell/evolution.html#boyscout –
如果可以的話,你應該使用'foldr'和'foldl'',如果必須的話''修復''或顯式遞歸。後者不那麼強大,所以你的代碼的讀者可以從中推斷出更多的屬性。 –
@stephentetley這是一個很好的鏈接,但我已經看到了!其實,在我第一次看到它(並通過研究了!)之後,我還有一些關於這些實現的問題,但也許是其他時間......無論如何,「boyscout」實現正是我所「傾向」實現的現在在我的大部分代碼中。 :) – Vadim