我与Scheme之间存在一些误解

时间:2011-01-25 16:21:30

标签: list functional-programming scheme r5rs

我刚刚开始学习计划,并且不太明白为什么这个功能不起作用:

;(define (sort l)
  (define (sorted? l)
    (if (= (length l) 2)            
        ; if simple list:
        (if (< (head l) (tail l)) 
            #t  
            #f) 
        ; if complex list:
        (if (and (< (head l) (head (tail l))) 
                 (sorted? (tail l)))
            #t  
            #f)))

输出:

  
    

(排序?(1 0))。 。程序申请:预期程序,     给定:1;参数是:0     (排序?'(1 0))。 。 &lt ;:期望type为第二个参数,给出:     (0);其他论点是:1

  

球拍,R5RS

2 个答案:

答案 0 :(得分:1)

你用什么方案? 在R5RS(方案标准)中,使用汽车和cdr来获得头尾。

cdr会给你PAIR,而不是原子。 那是有效的。

(定义(排序?l)     (if(=(length l)2)
        ;如果简单列表:         (如果(&lt;(car l)(cadr l))             #T
            #F)         ;如果复杂的清单:         (if(和(&lt;(head l)(head(tail l)))                  (排序?(尾l)))             #T
            #F)))

答案 1 :(得分:1)

这是因为您在行cadr有更多机会为您工作后,比较整数和列表if (< (head l) (head (tail l)))if (< (head l) (tail l))而不是; if simple list。< / p>

以下定义适用于我:

(define (sorted? xs)
  (cond
    ((<= (length xs) 1)
     #t)
    ((< (car xs) (cadr xs))
     (sorted? (cdr xs)))
    (else #f)))