我最近了解到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