L12. Lazy evaluation

{-
 
Lazy evaluation strategy:
  - evaluate function first (not parameter first)
  - evaluate each expression AT MOST ONCE!
 
 
Applications:
-}
 
 
ones = 1:ones
 
-- evaluating ones loops.
 
get 0 (x:xs) = []
get k (x:xs) = x : get (k-1) xs
 
{-
 
get 2 ones
get 2 (1:ones)
1:(get 1 ones)
1:(get 1 (1:ones))
1:(1:(get 0 ones))
1:(1:[])
 
[1,1]
-}
 
member :: Eq a => a -> [a] -> Bool
 
member x = foldr ((||).(==x)) False
 
or False x = x
or True _ = True
 
{-
member 1 [2,1,3,4,5,6,7]
foldr op False [2,1,3,4,5,6,7]
 
(2==1) || (foldr op False [1,3,4,5,6,7])
False || (foldr op False [1,3,4,5,6,7])
 
foldr op False [1,3,4,5,6,7]
 
(1 == 1) || (foldr op False [3,4,5,6,7])
 
True
 
Conclusion: lazy foldr is not that bad!
 
 
-}
 
member' :: Eq a => a -> [a] -> Bool
member' x = foldl (flip ((||).(==x))) False
 
 
 
nat x = x : (nat (x+1))
nats = nat 0
 
{-
take 0 _ = []
take n (x:xs) = x:(take (n-1) xs)
-}
 
type FSuccesor = Integer -> Integer
gen :: FSuccesor -> Integer -> [Integer]
 
gen f x = x:(gen f (f x))
-- [x, f x, f f x, f f f x, ....]
 
exx = zipWith (,) (gen (+1) 0) (gen (*2) 1)
 
 
{-
   Lista numerelor prime (Sita lui Eratostene)
   2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25
 
   2 is the first prime
   we need to filter out numbers divisible by 2 from the rest of the stream:
 
   filter (\k-> k 0109od00322 /= 0) rest
 
   3,_,5,_,7,_,9,_,11,_,13,_,15,_,17,_,19,_,21,_,23,_,25
 
   3 is the first prime
   we need to filter out numbers divisible by 3:
 
   5,_,7,_,_,_,11,_,13,_,_,_,17,_,19,_,_,_,23,_,25
 
-}
 
sieve :: [Integer] -> [Integer]
sieve (x:xs) = x:(sieve $ filter (\k-> k 0109od0032x /= 0) xs)
 
primes = sieve $ tail $ tail nats