2016-11-07 32 views
-1

一个经典的枚举使用展开:((lambda(x)...)括号是否以限定范围的某种方式放置?

(unfold-left (lambda (x) 
       (if (> x 10) 
        (#;no values) 
        (+ x 1))) 
      #;from 0) 

===>(0 1 2 3 4 5 6 7 8 9 10))

如果对范围的限制并不需要的是有任何方式只是写x没有lambda?

+2

我不清楚你在问什么 – naomik

+0

不,'lambda'不用于限制范围。它用于定义一个函数。 – molbdnilo

+0

im有什么要求,无论如何要写在上面没有拉姆达周围的X,以展开按预期工作? – X10D

回答

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)))))) 

正如你可以看到pfgtail-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)给出了相同的答案。

相关问题