関数の反復
を表現する簡潔で慣用的な方法はありますか? つまり、数値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 ソリューションやその他の関数型言語にも興味があります。