function iterationを簡潔で慣用的に表現する方法はありますか?すなわち、数字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
それらはすべて中間のリストを使用し、非常に簡潔ではありません。
私がこれまでに半群を使用した最短1:
、
\n f -> appEndo . times1p (n - 1) . Endo
それが唯一の正の数について(0ではないため)動作します。主に私はHaskellのソリューションに焦点を当てていますが、Scalaソリューションやその他の機能的言語にも興味があります。 Scalaで
何か? – pigworker
@pigworker iterateはよく見えます。 '\ n f x - > f xを繰り返します!! nは動作するはずです。 ((y、k) - >(f y、k-1))(x、n) 'のように、(0≦snd)≦ – tauli
である。現時点では、 'until'はまだ再帰的なので、インライン化されず、' f'のアンボックスとインライン化はできませんが、HEADでは、ワーカーラッパーが変換されています。コンパイラはループを書きます。 –