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

Почему все лямбды в "Маленькой шахте"?

Узнав немного схемы из SICP, я начал читать The Little Schemer (который я считаю довольно интересным), и я проделал одну четверть. Я заметил, что я могу написать много (большинство? Все) решений без использования лямбда, тогда как The Little Schemer всегда использует их. Например, самое первое определение

(define atom?
  (lambda (x)
    (and (not (pair? x)) (not (null? x)))))

который, если я не ошибаюсь, можно записать просто как

(define (atom? x) 
   (and (not (pair? x)) (not (null? x))))

Мне не хватает чего-то фундаментального, если я пишу без лямбда-решения?

4b9b3361

Ответ 1

Первоначально, define имел единственный синтаксис, чтобы установить переменную в значение. Это стиль, используемый в таких старых (и вневременных) книгах. Позже define получил другой синтаксис как ярлык, который вы используете.

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

Ответ 2

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

При обучении простые функции, начинающиеся с atom?, начинаются с define d на верхнем уровне. Это означает, что возможно и даже более компактно создать функцию с defun-style define, которую вы упомянули.

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

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

(define x 1)
(define l '(2 3 4 5))
(define s (cons x ls))
(define f (lambda (n) (+ n 2)))

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

Ответ 3

Вы можете увидеть, что ваша схема расширяет эти ярлыки (макросы) с помощью expand (если поддерживается):

mzscheme 4.2.4 (с DrScheme):

> (expand '(define (add1 x) (+ 1 x)))
#<syntax (define-values (add1) (lambda...>
(define-values
  (add1)
  (lambda (x) (apply + '1 x)))

Chez Scheme 8.0:

> (expand '(define (add1 x) (+ 1 x)))
(begin
  (set! add1
    (lambda (x)
      (+ 1 x)))
  (void))

lambda отображается как день.

Ответ 4

Я смутно помню, как профессор обсуждает что-то вроде этого.

Я думаю, что лямбда-решение используется по двум причинам:

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

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

Итак, я считаю, что выбор сводится к тому, что вам лично нравится лучше всего.

Ответ 5

Я немного читаю об исчислении лямбда (чтение "Реализация языков функционального программирования" Саймона Пейтона Джонса, бесплатный pdf файл), поскольку я использую TLS. И поэтому это всего лишь предположение, но я считаю, что авторы TLS хотят, чтобы вы действительно были лямбда-тяжелыми в своем мышлении. Они не выходят и не говорят об этом, но есть подсказки (см. Стр. 107 из TLS), что это всего лишь упражнение в применении лямбда-calc. Так что, может быть, они говорят, не говоря, "вы делаете лямбда-абстракции, мой друг!"

Ответ 6

The Little Schemer использует схему псевдокода (для упрощения образовательных целей и независимого от реализации). Сегодня стандартная схема имеет определение определения, в котором вы неявно вызываете лямбда (см. http://www.cs.cmu.edu/Groups/AI/html/r4rs/r4rs_7.html). Схема Little Schemer очень проста и не включает эту альтернативную форму.