是否有一种简洁、惯用的方式来表达函数迭代?也就是说,给定一个数字n
和一个函数f :: a -> a
,我想表达应用时间的\x -> f(...(f(x))...)
位置。f
n
当然,我可以为此创建自己的递归函数,但如果有一种方法可以使用现有工具或库快速表达它,我会很感兴趣。
到目前为止,我有这些想法:
\n f x -> foldr (const f) x [1..n]
\n -> appEndo . mconcat . replicate n . Endo
但是它们都使用中间列表,并且不是很简洁。
到目前为止我发现的最短的一个使用半群:
\n f -> appEndo . times1p (n - 1) . Endo
,
但它仅适用于正数(不适用于 0)。
我主要关注 Haskell 中的解决方案,但我也对 Scala 解决方案甚至其他函数式语言感兴趣。