Есть ли сжатый, идиоматический способ выражения итерации функций? То есть, учитывая число n
и функцию f :: a -> a
, я хотел бы выразить \x -> f(...(f(x))...)
, где f
применяется n
-times.
Конечно, я мог бы сделать свою собственную, рекурсивную функцию для этого, но мне было бы интересно, есть ли способ выразить ее в ближайшее время с помощью существующих инструментов или библиотек.
До сих пор у меня были следующие идеи:
-
\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 или даже другие функциональные языки.