Некоторое недоразумение между мной и Схемой - PullRequest
1 голос
/ 25 января 2011

Я только начал изучать схему и не могу понять, почему эта функция не работает:

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

Ракетка, R5RS

Ответы [ 2 ]

1 голос
/ 25 января 2011

Это потому, что вы сравниваете целое число и список, 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)))
1 голос
/ 25 января 2011

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

И cdr даст вам ПАРУ, а не атом.Это работает.

(определить (отсортировано? L) (если (= (длина l) 2)
; если простой список: (if (<(car l) (cadr l)) # t <br>#f); если сложный список: (if (и (<(голова l) (голова (хвост l))) (отсортировано? (Хвост l))) # t <br>#f)))

...