Esiste un modo sintetico e idiomatico per esprimere function iteration? Cioè, dato un numero n
e una funzione f :: a -> a
, mi piacerebbe esprimere \x -> f(...(f(x))...)
dove f
è applicato n
volte.Come esprimere in modo conciso l'iterazione della funzione?
Naturalmente, potrei creare la mia funzione ricorsiva, ma sarei interessato se c'è un modo per esprimerlo a breve usando gli strumenti o le librerie esistenti.
Finora, ho queste idee:
\n f x -> foldr (const f) x [1..n]
\n -> appEndo . mconcat . replicate n . Endo
ma tutti usano liste intermedi, e non sono molto conciso.
Quello più breve che ho trovato finora utilizza semigruppi:
\n f -> appEndo . times1p (n - 1) . Endo
,
ma funziona solo per i numeri positivi (non per 0).
Principalmente sono concentrato su soluzioni in Haskell, ma sarei interessato anche a soluzioni Scala o anche ad altri linguaggi funzionali.
qualcosa usando 'iterate', forse? – pigworker
@pigworker iterate sembra buono. '\ n f x -> iterate f x !! n' dovrebbe funzionare. – tauli
'until ((<= 0). Snd) (\ (y, k) -> (f y, k-1)) (x, n)'. Al momento, 'until' è ancora ricorsivo, quindi non sarà in linea, e non otterresti nessun unboxing e inlining di' f', ma in HEAD, è stato trasformato worker-wrapper, e quando tale cambiamento è rilasciato, il compilatore scriverà il ciclo per te. –