Viele moderne Programmiersprachen erlauben uns, potentiell unendliche Listen zu handhaben und bestimmte Operationen an ihnen auszuführen.Spielen mit der Unendlichkeit - Lazy arithmetics
Beispiel [Python]:
EvenSquareNumbers = (x * x for x in naturals() if x mod 2 == 0)
Solche Listen, weil nur Elemente vorhanden sein können, die tatsächlich benötigt werden, berechnet. (Lazy evaluation)
Ich frage mich nur aus Interesse, ob es möglich ist (oder sogar in bestimmten Sprachen praktiziert), den Mechanismus der Lazy Evaluation auf Arithmetik zu erweitern.
Beispiel: Angesichts der unendlichen Liste von geraden Zahlen evens = [ x | x <- [1..], even x ]
Wir nicht
length evens
da die Berechnung wäre hier erforderlich berechnen konnte nie enden.
Aber wir konnten tatsächlich feststellen, dass
length evens > 42
, ohne den gesamten length
Begriff zu bewerten haben.
Ist das in jeder Sprache möglich? Was ist mit Haskell?
Edit: Um den Punkt klarer zu machen: Die Frage ist nicht, wie man feststellen kann, ob eine faule Liste kürzer ist als eine gegebene Zahl. Es geht darum, konventionelle eingebaute Funktionen so zu verwenden, dass die numerische Berechnung träge erfolgt.
sdcvvc eine Lösung für Haskell zeigte:
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
Ist dies auch in anderen Sprachen möglich?
'Perl6' hat faule Listen http://perlcabal.org/syn/S09.html#Lazy_lists –