Подтвердить что ты не робот

Какая точка лямбда в схеме?

Я изучаю схему. Я знаю, как использовать выражения лямбда и let.

Однако я изо всех сил пытаюсь понять, в чем смысл использования лямбда. Разве вы не можете сделать все, чтобы позволить вам лямбда?

Было бы особенно полезно увидеть пример ситуации, когда лямбда-выражение является лучшим выбором, чем let.

Еще одна вещь - есть ли ситуации, где более полезно, чем лямбда? Если бы такой пример был бы приятным.

Изменить: меня также интересуют контрастные define и лямбда, поскольку они, похоже, выполняют схожие задачи.


Обновление:

Спасибо за помощь всем. Я прочитал несколько слов о lambda/let/define после прочтения ваших ответов, и теперь понимаю это намного лучше.

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

(define operateTwice
  (lambda (op1 op2)
    (lambda (x y)
      (op2 (op1 x y) y))))

((operateTwice * +) 2 3) ;equivalent to: (+ (* 2 3) 3), or in standard notation 2*3+3

Вывод:

9
4b9b3361

Ответ 1

A let является lambda.

например.

(let ((x 1))
  body)

можно перевести в

((lambda (x) body) 1)

Кроме того, на Схеме все структуры управления и среды могут быть представлены лямбда-выражениями и приложениями lambdas.

Итак, lambda является строго более мощным, чем let и составляет основу многих интересных конструкций, найденных на схеме.

Относительно define и lambda верхний уровень define добавляет привязку к среде верхнего уровня.

Когда вы пишете

(define (f x)
  body)

ты действительно говоришь

(define f (lambda (x) body))

Вложенные определения преобразуются в letrec, которые также могут быть переписаны с использованием lambdas.

Итак, опять же, многие конструкции Схемы могут быть переведены на что-то, используя lambda, и поэтому действительно стоит того, чтобы вы хорошо поняли lambda.

Ответ 2

Вы используете lambda, если хотите создать функцию, чтобы использовать ее в качестве аргумента для другой функции (например, map), но на самом деле вы не хотите называть эту функцию. Пример:

Если вы хотите добавить 42 к каждому номеру в списке, вы можете сделать:

(define (add42 x) (+ x 42))
(map add42 (list 1 2 3 4))

Но если вы не хотите указывать имя функции, которую вы используете только один раз, вы можете просто сделать:

(map (lambda (x) (+ x 42)) (list 1 2 3 4))

Ответ 3

Давайте на самом деле просто сократите выражение Лямбды. Следующие два выражения эквивалентны:

(let ((alpha 7)) (* 5 alpha))

((lambda (alpha) (* 5 alpha)) 7)

Lambda следует философии языка, что все должно выглядеть как математическая функция. Но на практике Let облегчает выяснение того, что происходит, если слишком много переменных. Представьте 10 переменных, которые имеют свои значения, определенные после блока лямбда, и вы пытаетесь сопоставить каждый из них с именем переменной. Пусть значения переменных помещаются рядом с их именами, удобными для программиста, но менее подходящими для функционала Философия программирования.

Lambda может использоваться для возврата функции из функции более высокого порядка, но пусть это не может сделать. Например:

(define (plus-list x)
  (cond ((number? x)
         (lambda (y) (+ (sum-n x) y)))
        ((list? x)
         (lambda (y) (+ (sum-list x) y)))
        (else (lambda (x) x))
        ))

> ((plus-list 3) 4)
10
> ((plus-list '(1 3 5)) 5)
14
> ((plus-list 'a) 5)
5

Lambda также может использоваться для передачи функции функции:

>(map (lambda (x) (+ 1 x)) '(-1 2 -3))
(0 3 -2)

Ответ 4

lambda создает новые анонимные функции, которые, конечно, оцениваются каждый раз, когда вы их используете.

создает временные имена для значений и устанавливается один раз для использования в области, определенной формой let.

Они действительно очень разные звери.

несколько примеров:

(lambda (x) (* 5 x))

(пусть ([x 2]) (* 5 x)) 10 (f (lambda (x) (* 5 x))]) (f 2)) 10

первая форма создает функцию для умножения на 5

вторая форма присваивает 2 х и умножает ее на 5, что приводит к 10

третья мы используем функцию 1 (которая умножается на 5) и называет ее с 2 как параметр, приводящий также к 10

Ответ 5

В схеме процедура (или функция) - это объект первого класса, такой как список, число или строка. Чтобы создать литерал списка, вы используете примитив с именем list:

> (define marks (list 33 40 56))
> marks
> (33 40 56)

Так же, как и для создания процедуры, вы используете примитив lambda (или специальную форму):

> (define add-marks (lambda (m) (apply + m)))
> (add-marks marks)
> 129

Как процедуры являются основной формой абстракции, Scheme предоставляет ярлык для define, чтобы упростить привязку новых процедур:

> (define (add-marks m) (apply + m))

Кроме этого, процедуры аналогичны всем другим объектам первого класса. Они могут передаваться в качестве аргументов другим процедурам, и процедура может оценивать для создания (или возврата) другой процедуры.

Ответ 6

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