函数递归本身 - 哈斯克尔



我试图递归地将函数传递给自己给定的次数。所以给定函数形式的输入 |重复数(计数( |论点。举个例子,如果给定输入: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 所以它看起来可以工作。

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

最新更新