Recentemente ho trovato uso per le seguenti funzioni di Haskell:
feed :: (a -> (a, b)) -> a -> Int -> (a, [b])
feed f input 0 = (input, [])
feed f input n
| n < 0 = error "feed f input n: n < 0"
| otherwise = (final, out:prev)
where (next, out) = f input
(final, prev) = feed f next $ pred n
nest :: (a -> a) -> a -> Int -> a
nest f x 0 = x
nest f x n
| n < 0 = error "nest f x n: n < 0"
| otherwise = f $ nest f x $ pred n
feed
calcola una funzione attraverso qualche input a
, con la funzione che restituisce un nuovo input per la chiamata successiva, oltre a "emettere" un output, che viene raccolto. nest
funziona allo stesso modo, ma non lascia funzioni emit
.
Questo mi sembra "Monadico" terribilmente, e mi sembra che qualcosa di Control.Monad
dovrebbe già fare questo (mi sono sorpreso a provare a reimplementare cose come sequence
, mapM
, ecc. ., per necessità prima, dato che sono un principiante con Haskell e non so bene cosa c'è nella libreria e cosa non lo è.
Esiste già qualcosa come la precedente (forse in un contesto più generale?)? Ho esaminato i documenti (almeno quelli con cui ho familiarità) e non riesco a trovare nulla, anche se questo sembra un modello comune. Esempio di utilizzo:
let pick10 rng = feed (swap . randomR (1, 10)) rng 10