这些天我在闲暇时使用Haskell进行编程。作为一个使用命令式语言超过8年的程序员,我很难围绕一些功能结构(特别是折叠)。我正在从项目Euler解决问题,并碰巧产生了以下代码。
f (num, den) s | num*10 < den = s
| otherwise = f (ratio (num, den) s') s'
where s' = (s+2)
使用folds或其他一些功能构造可以重写这种显式递归吗?我使用折叠的主要障碍是提出阶梯功能。最终我放弃了,并采取了递归。
编辑:另外,如何在函数中将另一个函数返回的输出作为调用函数的输入而不进行显式递归?
答案 0 :(得分:10)
总是很好的until
f = until test func
where test ((a, b), _) = a * 10 < b
func (p, s) = (ratio p s+2, s+2)
为了公平起见,你真的总是要进行某种递归,这只是你将它抽象出来的问题。 Haskell中没有“循环”。
关于你的第二个问题,我相信你刚刚问过“我如何在不进行递归的情况下自行调用函数”。简而言之,你不能因为那是递归的定义。
但是使用更高阶函数,例如until
iterate
和fix
(查看该函数的实现),您可以避免必须调用您的worker函数。他们负责在封面下进行明确的递归。