Как вы пишете процедуру, которая выводит функцию? (Ракетка) - PullRequest
1 голос
/ 02 ноября 2011

Как вы пишете процедуру, которая выводит функцию?(Ракетка)

Будет ли процедура выводить лямбду?

Ответы [ 4 ]

4 голосов
/ 13 ноября 2011

Вы имеете в виду: как использовать функции более высокого порядка, чтобы получить другую функцию?Если это так, взгляните на это:

(lambda (f) (lambda (x) (f x)))

Что это делает:

1: создать анонимное закрытие, инициализированное «f» в качестве параметра

2: в рамках первого тела создайте замыкание с параметром «x»

3: примените f к x (f - замыкание поверх x)

Чтоэто означает, что (до (fx) оценивается), f объявляется как функция с x в качестве аргумента.Применение f к x - это то, что возвращает все это выражение: в этом случае ничего особенного, поскольку мы не присваиваем никакого значения, кроме замыканий.

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

Вот конкретный пример того, насколько это может быть полезно.Давайте определим cons, car и cdr, используя только функции высшего порядка (замыкания):

(define (cons kar kdr) (lambda (kons) (kons kar kdr)))
(define (car kons) (kons (lambda (kar kdr) kar)))
(define (cdr kons) (kons (lambda (kar kdr) kdr)))

Чтобы понять это, передайте определения, но помните, что (define (foo bar) ...) означает (definefoo (лямбда (бар) ...)) ...

2 голосов
/ 02 ноября 2011

Другой способ сделать то же самое:

(define (output-function)
  (define (f x)
    x)
  f)

И вы можете проверить это так:

(define test (output-function))
(test 10) ; returns 10
2 голосов
/ 04 ноября 2011

Думайте об этом так. Из функции легко вывести число:

(define (output-num x) 7)

Мы также можем заранее определить вывод:

(define num 7)
(define (output-num x) num)

Теперь легко увидеть, как вывести функцию - просто обратитесь к ней в теле.

(define (a-function x) "hello")
(define (output-function y) a-function)

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

(define (output-function y) (lambda (x) "hello"))
2 голосов
/ 02 ноября 2011

Надеюсь, я не слишком лукавит:

(define answer
  (lambda (question)
    (lambda (answer)
      `((question: ,question)
        (answer: ,answer)))))

затем попробуйте:

> ((answer 'thequestion) 'withananswer)

в REPL.

...