Зачем использовать лямбда-нотацию вместо обычной - PullRequest
0 голосов
/ 10 октября 2019

Мы изучаем подмножество Ракетки для класса. Книга, сопровождающая класс, всегда использует лямбду изнутри (определите f (lambda () E)) вместо (определите f E).

Есть ли веская причина, почему? Не похоже, что внутри действительно необходимо иметь анонимную функцию.

(define plus-one (+ 0 1)) 
(define plus-one-l (lambda () (+ 0 1)))

Первый возвращается после вызова plus-one 1, а другой говорит, что это процедура, а использование () вокруг нее также возвращает 1.

Но почему вы предпочитаете процедуру простоимеющий значение?

Ответы [ 2 ]

3 голосов
/ 10 октября 2019

Зачем использовать лямбду?

Чтобы ответить на вопрос в вашем заголовке, мы бы использовали лямбду, потому что нам нужна процедура или функция вместо значения. Именно так Racket определяет функции.

Как вы уже определили, в первой строке присваивается значение от 1 до plus-one, а во второй - процедура добавления от 0 до 1 к * 1006. *.

Почему вы предпочитаете, чтобы процедура имела просто значение?

Это плохой пример, потому что эта процедура всегда будет возвращать одно и то же значение, но представьте, что нам нужна функциядобавить один к любому номеру. Ну, тогда у нас будет что-то вроде этого:

(define plus-one-n (lambda (n) (+ n 1)))

Теперь мы можем вызвать (plus-one-n 3), чтобы получить 4, или (plus-one-n 1336), чтобы получить 1337.

Процедуры без каких-либоПараметры полезны, если мы повторяем один и тот же код в разных местах. Если нам нужно добавить единицу в ноль много раз, мы можем сгруппировать этот код в процедуру, а затем просто вызвать ее. Если затем нам нужно изменить весь этот код, нам нужно только изменить тело процедуры. Поэтому, если наши требования изменяются так, что мы теперь хотим добавить два к нулю, нам нужно всего лишь изменить тело процедуры (хотя мы, вероятно, также захотим изменить имя в этом случае).

1 голос
/ 10 октября 2019

Отложить оценку.

Лямбда без аргументов называется "thunk". Thunks полезны для:

  1. Бесконечные ленивые потоки:
(define-syntax-rule (cons-stream x y)
  (cons x (lambda () y)))

(define ones (cons-stream 1 ones))

Функции как объекты:
(define (f x)
  (lambda () x))

(define a (f 2))

(a) ; -->  2
...