Почему все лямбды в Маленьком Схемере? - PullRequest
18 голосов
/ 24 января 2011

Изучив немного Scheme от 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))))

Я что-то упускаю, если пишу решения без лямбды?

Ответы [ 6 ]

22 голосов
/ 24 января 2011

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

При обучении вы начинаете с простых функций, таких как atom?, на верхнем уровне define d.Это означает, что возможно и даже более компактно создать функцию с defun -стилем 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 подобен любому старому выражению, является одной из самых важных вещей для любого функционального программиста.

14 голосов
/ 24 января 2011

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

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

8 голосов
/ 24 января 2011

Вы можете увидеть, что ваша Схема расширяет эти ярлыки (макросы) для использования 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 8.0:

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

lambda выглядит как день.

4 голосов
/ 24 января 2011

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

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

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

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

Поэтому я считаю, что выбор зависит от того, что вам лично больше всего нравится.

2 голосов
/ 15 мая 2012

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

1 голос
/ 24 января 2011

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

...