使用展开的经典枚举:
(unfold-left (lambda (x)
(if (> x 10)
(#;no values)
(+ x 1)))
#;from 0)
===> (0 1 2 3 4 5 6 7 8 9 10))
如果不需要限制范围,有没有办法在不使用lambda的情况下编写x?
答案 0 :(得分:0)
unfold
的实现方式如下:
(define (unfold p f g seed (tail-gen (λ (_) '())))
(let recur ((seed seed))
(if (p seed)
(tail-gen seed)
(cons (f seed)
(recur (g seed))))))
正如您所看到的那样p
,f
,g
和tail-gen
都是程序,因为它们在实现中被括号括起来。如果它们不是程序,则会出现application: not a procedure
错误。
您使用unfold
错误。你需要一个程序来获取当前值并返回或者你没有完成。第二个是获取种子并返回要收集的值的过程,第三个是创建下一个种子的过程。可选的tail-gen
接受种子并创建尾部,如果没有提供,将使用空列表。以下是如何制作0到10的列表:
#lang racket
(require srfi/1)
(require srfi/26)
(unfold (cut > <> 10) identity add1 0)
; ==> (0 1 2 3 4 5 6 7 8 9 10)
当然,(range 11)
会给出相同的答案。