es10 f e' una funzione che, preso un numero, restituisce la lista (infinita) di tutti i numeri interi a partire da questo. nums e' la lista (infinita) di tutti i numeri naturali In Haskell possiamo utilizzare oggetti infiniti come nums, grazie alla "laziness" di Haskell, cioe' alla strategia di riduzione che utilizza (in cui inoltre il valore di un'espressione e' valutato solo se serve per la computazione). In Haskell posso per esempio scrivere cose come hd (tail nums) il cui valore e' 1 (il secondo elemento della lista). In Scheme una cosa simile non posso farla, poiche' lo Scheme usa una strategia di riduzione call-by-value. Non e' infatti neanche possibile definire (define nums (f 0)) poiche' l'interprete Scheme dovrebbe associare a nums il valore di (f 0) Il valore di (f 0) e' (cons n (f (+ n 1))) La stategia call-by-value, prima di eseguire la cons valuta i suoi argomenti e cosi' si finisce per entrare in una serie infinita di chiamate ricorsive. In Scheme pero' e' possibile definire (define (f n) (cons n (f (+ n 1)))) poiche' per Scheme una lambda espressione (e e quindi anche l'espressione (lambda (n) (cons n (f (+ n 1))) ) e' un valore (in realta' e' la corrispondente chiusura ad essere un valore, come sappiamo. Pero' Scheme non riesce a valutare (car (cdr (f 0))) che e' praticamente il corrispondente di hd (tail nums). Infatti prima di eseguire la car debbo valutare il suo argomento. E prima di eseguire il cdr debbo valutare il suo argomento (f 0), finendo cosi', come visto prima, in una infinita serie di chiamate ricorsive.