2015-03-01 3 views
0

Я новый интриган. Я просто хочу спросить, могу ли я включить if-statements в лямбда? Например, (lambda (x) (если e1 e2 e3)). Я не понимаю, почему нет, но моя программа просто терпит неудачу, если я напишу так.если заявление в лямбда-схеме

Большое спасибо!

Вот мой код здесь. Я пытаюсь реализовать фильтр с более высокими функциями в качестве упражнения. Поскольку @ sepp2k ответила, что вполне нормально включать ifs в лямбда, я думаю, это проблема моего использования foldr?

Если кто-то может дать некоторое представление об этом, чтобы помочь мне понять, как это работает, я бы очень признателен!

(define filter (f xs) 
    (if (null? xs) '() 
    (foldr (lambda (elem ys) ((if (f elem) (cons elem ys) 
            (cons '() ys)))) '() xs))) 
+0

Пожалуйста, измените текст вопроса включить неработающего кода. –

ответ

2

Конечно, мы можем использовать if внутри lambda. Фактически любое допустимое выражение может входить в lambda. Есть более серьезные ошибки в коде:

  1. Есть дополнительные (и ненужные) Скобки вокруг сокровенной if выражения. Схема будет интерпретировать их как функции приложения, и это не то, что вы хотите сделать здесь
  2. else выражения if неправильно, вы просто должны пройти аккумулятор без изменений
  3. Определение функции неверен

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

(define (filter f xs) 
    (foldr (lambda (elem ys) 
      (if (f elem)  ; if the predicate is true 
       (cons elem ys) ; then `cons` element to accumulator 
       ys))   ; otherwise leave accumulator alone 
     '() 
     xs)) 

Он работает, как ожидалось:

(filter even? '(1 2 3 4 5 6)) 
=> '(2 4 6) 
+1

Как я небрежен! Большое спасибо! – ruyuan

1

Да, это абсолютно правильно использовать ifs внутри lambdas. Если ваша программа не работает, это должно быть по другим причинам.

0

Дополнительные скобки вокруг вызова if. Групповая перегрузка схем (list of expressions) и функциональные вызовы (+ 2 2). FWIW, вы также можете использовать foldl, так как foldr занимает O(|elements of the input|) память.

Идти глубже, лямбды - это так называемая «специальная форма» в схеме. Это означает, что они подчиняются различным правилам оценки. Я только объясняю это, потому что он дает некоторое представление о ключевой особенности схемы: все это всего лишь форма. define? Специальная форма. lambda? Специальная форма. Ничего вы не могли бы написать, если бы вам действительно понравилось. Это означает, что с большим количеством специальных форм, даже если они кажутся автоматическими/запеченными, у них нет никаких эзотерических предостережений.

Кроме того, просто на будущее, вот несколько драгоценных камней для вашего коварного: MIT Scheme Reference (lambdas), Racket Guide (Pairs and Lists)

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