2016-11-07 37 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)給出了相同的答案。

相關問題