Immagina di dover passare una sequenza e di conoscere anche i valori intermedi in diversi punti lungo l'intervallo. Questo è quello che ho usato per questo:Qual è questo modello di piegatura e iterazione?
[a,b,c] = map fst . tail $ chain [g i, g j, g k] (zero, sequence)
g :: Integer -> (a,b) -> (a,b)
chain (f:fs) x = x : chain fs (f x)
chain [] x = [x]
La funzione g
consuma una certa parte di una sequenza di ingresso (di lunghezza i
, j
, ecc), iniziando con un valore di partenza e producendo risultati della stessa digitare, da inserire nella prossima invocazione. Consumare più volte la sequenza per lunghezze diverse a partire dall'inizio e lo stesso valore iniziale sarebbe inefficiente, ovviamente sia in termini di tempo che di spazio.
Quindi da una parte pieghiamo su questa sequenza di numeri interi - punti intermedi sulla sequenza; d'altra parte iteriamo questa funzione, g
. Che cos'è? Mi sto perdendo qualcosa di base qui? Questo può essere espresso in qualche modo con il repertorio regolare di pieghe, ecc.?
EDIT: risolto: quanto sopra è semplicemente
[a,b,c] = map fst . tail $ scanl (flip g) (zero, sequence) [i, j, k]
interessante come un'iterazione modificabile effettivamente è ripiegare l'elenco dei modificatori.
Praticamente vuoi dire scanl? http://www.haskell.org/hoogle/?hoogle=scanl – Marcin
@Marcin ah, sì, le cose di base. Probabilmente sì. Ciò che mi ha confuso era che 'g' stesso ripiega anche sulla sequenza. Immagino che la funzione di scansione combinerebbe '(zero, sequenza)' con 'i' e scansionerà direttamente l'elenco' [i, j, k] '... Grazie, ci proverò! –