In a strict languages, like Scheme we need the whole
Stream ADT to be defined first.
(define-syntax stream-cons (syntax-rules () ((_ x xs) (cons x (delay xs))))) (define (stream-cdr xs) (force (cdr xs))) (define (stream-take n xs) (if (<= n 0) '() (cons (car xs) (stream-take (- n 1) (stream-cdr xs)))))
(define (repeat x) (stream-cons x (repeat x))) (define (replicate n x) (stream-take n (repeat x))) (define (iterate f x) (stream-cons x (iterate f (f x))))
While in Haskell every expression is an implicit
Promise or so called thunk.
repeat :: a -> [a] repeat x = xs where xs = x : xs
replicate :: Int -> a -> [a] replicate n x = take n (repeat x)
iterate :: (a -> a) -> a -> [a] iterate f x = x : iterate f (f x)