DrRacket: анонимная лямбда-функция

В чем разница между test1:

(define test1
  (lambda (x) (* x x)))

и test2

(define (test2 x)
  (lambda (x) (* x x)))

Разве оба не должны быть одинаковыми. Когда я тестирую test1, я получаю правильный ответ, но test2 возвращает #<function> или (lambda (a1) ...)

Это почему?

Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
2
0
120
2

Ответы 2

Test1 эквивалентен

(define (test3 x)
    (* x x))

В test2 у вас слишком много лямбды.

(define (func-name argument)
  body))

Это определяет Переменнаяfunc-name как функцию, которая принимает один аргумент с body в качестве содержимого функции. Это сокращение от:

(define func-name (lambda (argument)
  body)

Таким образом, ваш второй пример можно записать так:

(define test2 
  (lambda (x)
    (lambda (x) (* x x))))

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

(define (make-less-than value)
  (lambda (arg)
    (< arg value))

(filter (make-less-than 10) '(9 10 1 11 4 19))
; ==> (9 1 4)

Итак, make-less-than возвращает функцию, которая проверяет, меньше ли переданный аргумент, чем value, в данном случае 10. Его можно повторно использовать для других значений. Всего один раз вы могли бы с таким же успехом написать:

(filter (lambda (v) (< v 10)) '(9 10 1 11 4 19))

Другие вопросы по теме