【发布时间】:2015-01-13 17:46:55
【问题描述】:
在 Haskell 中,将尽可能多的代码写入高阶函数(如折叠、映射和展开)中是惯用的做法。那么什么样的代码不能用那些高阶函数编写呢?什么时候需要显式递归?
【问题讨论】:
-
您是在问什么时候递归是必要的 还是什么时候是惯用的?你的标题是第一个;你的最后一句话是第二句话。
-
好点。我有点想知道两者,但我将其限制在一个问题上:什么时候真正需要显式递归?我将编辑问题。
-
高阶函数如
map和fold是通过递归实现的。如果您使用它们,从语义上讲,您使用的是递归。从语法上讲,您不必使用递归,除了一次 - 定义“规范递归函数” -fix f = let x = f x in x。 -
但是
fix是在作弊——一个诚实的程序员会说使用fix的函数是递归的。以下方案有丰富的理论fix;请参阅Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire 了解著名的治疗方法。 -
@user2407038 从 Haskellian 的角度来看,计算理论只能走到这一步——
fix的多态递归不太可能做得很好。