【发布时间】:2014-03-08 10:12:09
【问题描述】:
我最近了解了Data.Function.fix,现在我想将它应用到任何地方。例如,每当我看到一个递归函数时,我都想“fix”它。所以基本上我的问题是我应该在何时何地使用它。
为了更具体:
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 的使用相关的其他 cmets。
【问题讨论】:
-
"我最近了解了 Data.Function.fix,现在看来我想把它应用到任何地方。" 这让你成为一名童子军 Haskell 程序员然后 - willamette.edu/~fruehr/haskell/evolution.html#boyscout
-
如果可以,您应该使用
foldr和foldl',如果必须使用fix或显式递归。后者的功能较弱,因此您的代码的读者可以从中推断出更多的属性。 -
@stephentetley 这是一个很棒的链接,但我已经看到了!实际上,在我第一次看到它时(并仔细研究了它!)我对其中几个实现还有另一个问题,但也许其他时间......无论如何,“童子军”实现正是我“倾向于”做的现在在我的大部分代码中。 :)
-
@TomEllis 如果您能抽出时间详细说明这一点,我将不胜感激。关于我的第一个问题,Joseph 在下面已经给了我一个很好的提示,我仍然希望根据大师的经验建立一个更通用的“指南”。
-
注意
_Y f = f (_Y f)(递归,值--复制)和fix f = x where x = f x(核心递归,引用--共享)之间的区别。
标签: haskell fixpoint-combinators