2011-01-25 3 views
1

Я только начал изучать схему и не совсем понятно, почему эта функция не работает:Некоторые недопонимание между мной и Схемой

;(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)). , <: ожидает тип как второй аргумент, данный: (0); другие аргументы: 1

Ракетка, R5RS

+0

Что Scheme вы используете? – leppie

ответ

1

Это связано с тем, что вы сравниваете целое число и список, cadr или if (< (head l) (head (tail l))) вместо if (< (head l) (tail l)) после того, как у линии ; if simple list будет больше шансов работать на вас.

следующее определение работает для меня:

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

вы правы! Однако как я могу «перечислить» список? (2) -> 2 – Halst

+0

@Halst: До тех пор, пока '(2)' равнозначен '(cons 2 (list))', вы можете получить свое значение из одного синглета с помощью только 'car':' (car (cons 2 (list))) 'будет возвращать' 2', голову («cons») списка. –

+0

ОК, имеет смысл – Halst

1

Какую схему вы используете? В R5RS (стандарт схемы) используйте автомобиль и cdr, чтобы получить голову и хвост.

И cdr даст вам PAIR, а не атом. Это работает.

(определить (отсортированных л) (если (= (длина л) 2)
, если простой список: (если (< (машина л) (CADR л)) #t
#F) , если комплекс список: (если (и (< (головка л) (головка (хвост л))) (отсортированных (хвост л))?) #t
#f)))