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