是(lambda(x)...)括号以某种方式放置用于限制范围?

时间:2016-11-07 04:30:59

标签: functional-programming scheme racket

使用展开的经典枚举:

(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?

1 个答案:

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

正如您所看到的那样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)会给出相同的答案。