我试图递归地将函数传递给自己给定的次数。所以给定函数形式的输入 |重复数(计数( |论点。举个例子,如果给定输入:f 3 2
它会返回f(f(f 2)
如果函数值在"方形"处,它也应该对参数进行平方。
就逻辑而言,我的做法如下:
def repeatnew func count arg
if count == 1 then (func arg)
else (func (repeatnew func (count -1) arg))
一段时间以来,我一直在尝试研究解决方案,我遇到了使用迭代和其他一些函数的情况。最后我遇到了这个: https://wiki.haskell.org/Higher_order_function 但是我无法实施有效的解决方案。
编辑:我尝试实现的解决方案我可以正确编译,我对 haskell 仍然非常缺乏经验,并希望解释如何使用我的参数创建高阶函数。
从@Antisthenes的评论中分离出来,另一种方法是使用没有基本情况的foldl1
。
pipeNTimes :: (a -> a) -> Int -> (a -> a)
pipeNTimes f n = foldl1 (.) $ replicate n f
pipeNTimes (*2) 3 2 -- returns 16
诚然,我只是 Haskell 的初学者,所以这可能是一个幼稚的实现,但我认为这符合您的需求:
applyRecursively f x y
| x == 1 = f y
| otherwise = f (applyRecursively f (x-1) y)
applyRecursively
函数将一个函数和两个数字作为参数。
如果中间参数(计数(为 1,则我们将参数函数应用于参数 y。这是停止递归的边缘情况。
然后,otherwise
guard 子句递归调用,x
参数递减,并将函数f
应用于结果。
我已经使用这样的 lambda 对其进行了测试:
applyRecursively (x -> x + 1) 3 3
它应该将 1 加到 3 的值 3 三次 - 它返回值 6
所以它看起来可以工作。
正如我所说,我是一个初学者,但我认为这符合您的要求。