Eine mögliche Lösung:
> import Data.Monoid
> import Debug.SimpleReflect -- not really needed, just for showing the result
> (appEndo . mconcat . replicate 5 . Endo $ f) a
f (f (f (f (f a))))
weitere (bereits erwähnt):
> iterate f a !! 5
f (f (f (f (f a))))
(fügen lambdas, wenn Sie es in eine Funktion aktiviert werden sollen)
jedoch nicht vergessen, dass Haskell faul ist: die oben genannten Methoden werden zunächst durch die Anwendung f
oft eine Thunk bauen und erst dann beginnen zu bewerten. Manchmal könnte f
in konstantem Raum iteriert werden, z. wenn f :: Int -> Int
(und f
selbst in konstantem Raum arbeitet), aber die oben genannten Ansätze arbeiten nur im linearen Raum.
ich durch eigene strenge Iteration combinator definieren würde, z.B .:
iter :: Int -> (a -> a) -> a -> a
iter 0 _ x = x
iter n f x = iter (pred n) f $! f x
oder sogar
iter n f x = foldl' (flip $ const f) x [1..n]
, die mehr oder weniger die Haskell Übersetzung von dem, was bereits in der Frage gestellt.
Alternativ können wir eine strenge Version von iterate
definieren (die IMHO sollte bereits vorhanden sein ...)
iterate' :: (a -> a) -> a -> [a]
iterate' f x = x : (iterate' f $! f x)
kann eine des downvoters bitte erklären, was das Problem hier? Die Frage scheint mir gut zu sein. FP Subcommunities hier sind in der Regel sehr freundlich und ich hoffe, wir können es so halten, also bitte zumindest, warum die Frage Ihrer Meinung nach schlecht ist. – Carsten
Ich denke, du solltest eine Frage pro Sprache stellen, da zukünftige Leute wahrscheinlich eine Antwort suchen werden. Hauptsächlich würde ich sagen, wenn Ihre Frage andere Antworten erwartet, dann sollten Sie es teilen. – PatJ
@Carsten Die Pegel des Moderationsrauschens scheinen momentan höher als üblich zu sein. In den letzten Tagen habe ich nicht nur merkwürdige Downvotes, sondern auch absurde Stimmen in mindestens zwei Haskell-Fragen gesehen. – duplode