ErikR e John Coleman hanno già risposto le parti principali della sua domanda, ma vorrei far notare qualcosa in più:
E 'meglio scrivere le funzioni in un modo che semplicemente non dipendono sulla finitezza o l'infinito dei loro input - a volte è impossibile ma molto spesso è solo una questione di riprogettazione. Ad esempio, invece di calcolare la media dell'intero elenco, è possibile calcolare una media corrente, che è di per sé una lista; e questa lista sarà di per sé infinita se la lista di input è infinita e finita altrimenti.
avg :: [Double] -> [Double]
avg = drop 1 . scanl f 0.0 . zip [0..]
where f avg (n, i) = avg * (dbl n/dbl n') +
i /dbl n' where n' = n+1
dbl = fromInteger
nel qual caso si potrebbe mediare una lista infinita, di non dover prendere il suo length
:
*Main> take 10 $ avg [1..]
[1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0]
In altre parole, una possibilità è quella di progettare il più delle vostre funzioni semplicemente non si preoccupa dell'aspetto infinito e ritarda la valutazione (completa) delle liste, e di altre strutture di dati (potenzialmente infiniti), fino a una fase più tardiva del programma.
In questo modo, immagino, saranno anche più riutilizzabili e componibili - qualsiasi cosa con presupposti meno o più generali sui suoi input, tende ad essere più componibile; viceversa, qualsiasi cosa con ipotesi più o più specifiche tende ad essere meno componibile e quindi meno riutilizzabile.
fonte
2015-10-08 13:17:33
Sembra strano. Perché la funzione di lunghezza esiste anche se non puoi semplicemente usarla? – ais
Bene - cosa vorresti che restituisse la lunghezza di una lista infinita? – ErikR
Preferirei che la lunghezza non accetti liste infinite e che digiti qualcosa come '' 'FiniteList a -> Int''' – ais