向大家学习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中编写重复应用程序的功能?请使用递归,高阶函数或其他任何内容发布任何可能的解决方案。
答案 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
。如果这是一个可能发生在您的用例中的情况,您应该考虑哪种行为更适合您。