2015-02-09 2 views
0

Я пытаюсь написать программу, которая добавит числа в список. Однако, когда я предоставляю ввод в виде списка, Scheme не дает мне выход.Схема, возвращающая неправильный тип, чтобы применить для ввода списка

Мой код выглядит следующим образом:

(define (sumlist lst) 
    (cond ((pair? lst) (+ (car lst) (sumlist(cdr lst)))))) 

Почему это происходит? Я правильно даю ввод, т. Е. Цитирую список.

Я даю вход следующим образом: (sumlist '(1 2 3))

EDIT: Я слегка изменил вопрос. Список не был указан в pair? 'lst, и именно поэтому я получал сообщение об ошибке. Теперь я не получаю сообщение об ошибке. Однако я тоже не получаю никаких результатов.

EDIT2: Я не сортировал список в pair? lst. Однако теперь это дает мне следующую ошибку: неправильный тип в arg2 # Я обновил код соответствующим образом.

+1

Я не думаю, что вы понимаете, как приложение функции представлено в синтаксисе схемы. Это должно быть '(car lst)' и '(sumlist (cdr lst))'. –

+0

'(пара? Lst)' выглядит подозрительно ... – leppie

+0

@leppie Это тоже. Как ни странно, это было «(пара? Lst)», пока несколько минут назад - ОР отредактировал вопрос. –

ответ

2
  1. Синтаксис вашего функционального приложения неверен. Применение функции всегда префикс на схеме, т.е. car(lst) должен быть (car lst) и т.д.
  2. Кроме того, (pair? 'lst) неправильно, так как вы не должны цитировать аргумент. Это проверит, если символ lst - это пара, которая, очевидно, всегда неверна.
  3. Вам нужен базовый футляр, если вы не хотите хотите вернуть - когда вы получите пустой список, который должен вернуть 0.

Собираем все это вместе, и вы должны иметь это:

(define (sumlist lst) 
    (if (pair? lst) 
     (+ (car lst) (sumlist (cdr lst))) 
     0)) 

(Я также изменил cond к if так cond ненужно в этом случае.)

+0

Зачем нужен базовый чехол? Не возвращает ли схема вычисляемого значения последнего выражения? Поэтому, даже если я не упоминаю базовый случай, Scheme вернет последнее выражение, когда условие «пара»? lst' становится ложным. Не так ли? –

+1

@RohitShinde Это не имеет никакого смысла, прежде всего, поскольку это вернет '# f', который нельзя добавить к числу. Во-вторых, это не работает с 'cond', так как' cond' расширяется в формы 'if', а' if' - специальная форма. В частности, 'cond' без предложения' else' возвращает '# ', если условия не совпадают. –