Loops 函数本身的递归-haskell

Loops 函数本身的递归-haskell,loops,haskell,Loops,Haskell,我试图递归地将一个函数传递给它自己给定的次数。因此,以函数| RepeatNumber(Count)|参数的形式给出输入。例如,如果给定输入:f32它将返回f(f(f2),如果函数值为“square”,它将使参数平方,那么这也应该起作用 就逻辑而言,我的做法如下: def repeatnew func count arg if count == 1 then (func arg) else (func (repeatnew func (count -1) arg)) 我一直在研

我试图递归地将一个函数传递给它自己给定的次数。因此,以函数| RepeatNumber(Count)|参数的形式给出输入。例如,如果给定输入:
f32
它将返回
f(f(f2)
,如果函数值为“square”,它将使参数平方,那么这也应该起作用

就逻辑而言,我的做法如下:

def repeatnew func count arg
    if count == 1 then (func arg)
    else (func (repeatnew func (count -1) arg))
我一直在研究一个解决方案,但是我遇到了使用Iterate和其他一些函数。最后我遇到了这个问题:但是我无法实现一个有效的解决方案


编辑:我尝试实现的解决方案我可以正确编译,我对haskell仍然非常缺乏经验,如果能解释一下如何使用我的参数创建高阶函数,我将不胜感激。

我承认我只是haskell的初学者,所以这可能是一个幼稚的实现,但我认为这符合您的要求ng适用于:

applyRecursively f x y
    | x == 1 = f y
    | otherwise = f (applyRecursively f (x-1) y)
applyRecursive
函数接受一个函数和两个数字作为参数

如果中间参数(计数)是1,那么我们将参数函数应用于参数y。这是停止递归的边缘情况

否则
guard子句随后递归调用
x
参数,并将函数
f
应用于结果

我已经使用类似以下的lambda对其进行了测试:

applyRecursively (\x -> x + 1) 3 3
它应该在3的值上加1三次-它返回一个
6
的值,因此看起来它可以工作


正如我所说,我是一个初学者,但我认为这正是您所需要的。

从@Antisthenes的注释中衍生出来,另一种方法是使用
折叠1
,而不使用基本情况

pipeNTimes :: (a -> a) -> Int -> (a -> a)
pipeNTimes f n = foldl1 (.) $ replicate n f

pipeNTimes (*2) 3 2 -- returns 16

我无法实现一个有效的解决方案
您的具体问题是什么阻止了您的解决方案工作?您尝试了什么实际代码?仅举我尝试过的示例:
fpow f n x=iterate f x!!n
repeatFun::Char->Int->Char->String repeatFun func count arg repeatFun=(count-1)*(func)+(arg)repeatFun=func(repeatFun func(count-1)arg)
我是haskell的新手,所以我的实施技能严重不足。您的帖子目前缺少一个问题,这对于问答网站来说是至关重要的。请发布您的帖子。如果遇到任何问题,请添加“错误”代码和您收到的任何错误消息,或者,如果行为不是您预期的,则为预期和实际行为。感谢您修复布局,关于一个问题,使用我提到的链接,在给定特定输入的情况下,如何实现高阶函数。我应该能够将次数传递给循环,传递函数的参数,该参数也作为输入参数,但我很难将其转换为实际的haskell代码。不幸的是,我在前面的评论中尝试的解决方案甚至无法编译,我对haskell的有限知识也无法帮助我找到解决方案。“我尝试实现的解决方案可以正确编译,但我对haskell仍然缺乏经验,如果能解释如何使用我的参数创建高阶函数,我将不胜感激。“听起来您希望您的解决方案得到审核。要进行审核,请转到。它也可以使用简单的if而不是guards来实现。对于功能更强大的方法和codegolf,它还可以定义为:
applyrecursivey f n arg=foldr(.)id(replicate n f)$arg
对于更多的codegolfing,还有一个无点版本:
applyRecursively=(foldr(.)id.).flip replicate
@Antisthenes我想我的头脑已经融化了!函数式编程有时在我试图理解它的时候看起来还是很神奇的,但是非常感谢你的代码,这真的很有帮助。@Antisthenes:applyrecurity f n arg=iterate f arg!!n?@yatima2975:是的,这也是个好主意。从一开始我就考虑到无点写作,这就是我为什么这样写的原因。+1因为这是一种比我的努力更实用的方法,我从中学到了很多!