Схема (Lazy Racket) бесконечный список натуральных чисел

Я думаю, что Lazy Racket должен быть полезен для обработки бесконечных списков. Согласно статье Lazy Racket в Википедии, fibs (бесконечный список чисел Фибоначчи) может быть определяется как:

;; An infinite list:
(define fibs (list* 1 1 (map + fibs (cdr fibs))))

Как определить бесконечный список натуральных чисел?


person Community    schedule 23.06.2013    source источник


Ответы (2)


#lang lazy
(define Nat (cons 1 (map (lambda (x) (+ x 1)) Nat)))

благодаря Уиллу Нессу.

я также нашел

#lang lazy
;;; infinite sequences represented by a_(n+1) = f(a_n)
(define inf-seq (lambda (a0 f) (cons a0 (inf-seq (f a0) f))))
(define Nat (inf-seq 1 (lambda (x) (+ x 1))))

Для вывода

(define (outputListData list)
   (cond 
       [(null? list) #f] ; actually doesn't really matter what we return
       [else 
            (printf "~s\n" (first list)) ; display the first item ...
            (outputListData (rest list))] ; and start over with the rest
    )
)

(outputListData Nat)
person Community    schedule 23.06.2013
comment
для сравнения, в Haskell она известна как iterate (в Haskell есть действительно хорошие имена для таких функций): iterate f x = x : iterate f (f x). И для вывода у него есть take n [] = [] ; take 0 xs = [] ; take n (x:xs) = x : take (n-1) xs. (a:b в Haskell похож на (a . b) в Scheme). Итак, nats = iterate (1+) 1, и мы видим первые 10 из них с take 10 nats. Ракетка тоже имеет take. - person Will Ness; 23.06.2013

#lang lazy

(define nats (cons 1 (map 1+ nats)))

Очевидно, это не работает, и 1+ следует заменить на (lambda (x) (+ x 1)). Спасибо @kenokabe за тестирование. (add1 — имя собственное.)

person Will Ness    schedule 23.06.2013
comment
(определить Nat (cons 1 (map (лямбда (x) (+ x 1)) Nat))) Хорошо, вы это имели в виду, спасибо. - person ; 23.06.2013
comment
@kenokabe, в чем была ошибка, не могли бы вы показать ее/скопировать сюда? - person Will Ness; 23.06.2013
comment
1+: несвязанный идентификатор в модуле в: 1+ - person ; 23.06.2013
comment
Я думаю, что «1+» не определено в языковой системе. - person ; 23.06.2013
comment
1+ в Racket называется add1. Может быть, и в Lazy Racket тоже? - person Sylwester; 23.06.2013
comment
@Sylwester, спасибо, ребята. Я думал, что 1+ был по крайней мере в R5RS, но, похоже, это не так. - person Will Ness; 23.06.2013
comment
Используйте add1 -- имя, которое используется в Racket. (1+ не является стандартным, и искать ответы на R5RS в этом случае бессмысленно.) - person Eli Barzilay; 23.06.2013