2016-10-28 2 views
-1

У меня есть фрагмент кода, который может получить пересечение двух списков. Однако я хочу удалить все дубликаты из списка. Я использую функцию remove-duplicates(). Всякий раз, когда я его использую, drRacket дает следующую ошибку.Удаление дубликатов из списка пересечений в схеме

заявление: не является процедурой; ожидается процедуру, которая может быть применена к аргументам Дано: (abccd) аргументы ...: [нет]

Вот мой код

#lang scheme 
(define (intersect lst1 lst2) 
    (removedup(lst1 lst2)) 
    (cond 
     ((null? lst1)(quote())) 
     ((isin? (car lst1) lst2) 
     (cons (car lst1) 
      (intersect (cdr lst1) lst2))) 
     (else (intersect (cdr lst1) lst2)))) 

(define (removedup lst1 lst2) 
    (remove-duplicates(lst1)) 
    (remove-duplicates(lst2)) 
) 

(define (isin? a lat) 
    (cond 
     ((null? lat) #f) 
     (else (or (equal? (car lat) a) 
       (isin? a (cdr lat)))))) 

Мой вход > (intersect '(a b c c d) '(c d e f))

Может ли кто-нибудь помочь мне решить мою проблему? Заранее спасибо

ответ

5

Похоже, вы едете в Ракету с другого языка. В Racket и Scheme вы не можете добавлять дополнительные скобки; каждая пара круглых скобок имеет конкретное значение. В этом случае, вы написали

(remove-duplicates(lst1)) 

, когда вы имели в виду, чтобы написать

(remove-duplicates lst1) 

Первый из них состоит из двух вызовов функции: вызов lst1, а затем вызов для удаления-дубликатов с результат. Первый из них не может быть успешным, поскольку lst1 не является функцией.

Также обратите внимание на розовую подсветку, которую дает DrRacket; это, вероятно, подчеркивает проблемную область.

Также обратите внимание, что при исправлении этой ошибки вы можете получить еще одну очень похожую ... на следующей строке?

+0

Спасибо! Удалось устранить ошибки. Однако я все еще не получаю результат, который я хочу. Мой вход -> (пересекается '(a b c c d)' (c d e f)). И мой вывод: (c c d). Я хочу, чтобы мой результат был (c d). – LvanRooij

+1

@LvanRooij Racket - это функциональный язык программирования, и большинство функций чисты, когда это возможно. 'remove-duplicates' не изменяет свои аргументы (фактически, списки неизменяемы в Racket), он просто возвращает новый список с удаленными дубликатами. Вы должны обернуть свое возвращаемое значение с помощью 'remove-duplicates', а не пытаться вызвать его для побочного эффекта. –

+0

Тестовые чеки являются ключевыми, здесь. Кроме того, если вы не знаете, как функции оцениваются, попробуйте использовать stepper для создания вашей интуиции. Чтобы стать программистом, нужно формулировать гипотезы о том, что происходит, и тестировать их. –

Смежные вопросы