在Haskell中多次应用函数

时间:2014-03-24 07:13:09

标签: haskell higher-order-functions

向大家学习Haskell ("高阶函数",subsection "Some higher-orderism is in order")描述调用函数的示例函数applyTwice争论两次:

applyTwice :: (a -> a) -> a -> a  
applyTwice f x = f (f x)

但是我需要一个函数,它可以在一些参数上应用一些函数任意次数。例如,applyN 3 f x等同于f $ f $ f x。我如何在Haskell中编写重复应用程序的功能?请使用递归,高阶函数或其他任何内容发布任何可能的解决方案。

3 个答案:

答案 0 :(得分:6)

我总是这样做iterate f x !! n

答案 1 :(得分:1)

你必须做一个递归函数。显而易见的情况是当您应用函数0时,它就像您不修改输入。递归将来自applyN n f x == f (applyN (n -1) f x或因为函数的组合是关联的applyN n f x == apply (n - 1) f (f x)这一事实。第二种选择可以提高性能,因为它将是尾递归

applyN :: Int n => n -> (a -> a) -> a -> a
applyN 0 _ x = x
applyN n f x = applyN (n - 1) f (f x)

答案 2 :(得分:0)

applyN = (foldr (.) id.) . replicate

-->>
applyN 0 f = id
applyN 1 f = f
applyN 2 f = (f.f)
-- ...

或者只是使用iterate,就像之前所说的那样。唯一真正的区别在于,如果使用负数n,使用迭代将获得异常,而在此解决方案中,您将获得id。如果这是一个可能发生在您的用例中的情况,您应该考虑哪种行为更适合您。