Muchos lenguajes de programación modernos nos permiten manejar listas potencialmente infinitas y realizar ciertas operaciones en ellas.Jugar con el infinito: aritméticos vagos
Ejemplo [Python]:
EvenSquareNumbers = (x * x for x in naturals() if x mod 2 == 0)
Tales listas pueden existir porque sólo los elementos que son realmente necesarios están computarizada. (Evaluación diferida)
Me preguntaba por interés si es posible (o incluso se practica en ciertos idiomas) extender el mecanismo de evaluación perezosa a la aritmética.
Ejemplo: Dada la lista infinita de los números pares evens = [ x | x <- [1..], even x ]
No pudimos calcular
length evens
ya que el cálculo necesario aquí nunca terminará.
Pero en realidad podría determinar que
length evens > 42
sin tener que evaluar toda la length
plazo.
¿Es posible en cualquier idioma? ¿Qué hay de Haskell?
Editar: Para aclarar el punto: La pregunta no es sobre cómo determinar si una lista perezosa es más corta que un número dado. Se trata de usar funciones integradas convencionales de forma que el cálculo numérico se realice de forma perezosa.
sdcvvc mostró una solución para Haskell:
data Nat = Zero | Succ Nat deriving (Show, Eq, Ord)
toLazy :: Integer -> Nat
toLazy 0 = Zero
toLazy n = Succ (toLazy (n-1))
instance Num Nat where
(+) (Succ x) y = Succ (x + y)
(+) Zero y = y
(*) Zero y = Zero
(*) x Zero = Zero
(*) (Succ x) y = y + (x * y)
fromInteger = toLazy
abs = id
negate = error "Natural only"
signum Zero = Zero
signum (Succ x) = Succ Zero
len [] = Zero
len (_:x') = Succ $ len x'
-- Test
len [1..] < 42
También es posible esto en otros idiomas?
'Perl6' tiene listas perezosas http://perlcabal.org/syn/S09.html#Lazy_lists –