Я использую лекции и текст SICP, чтобы узнать о Scheme самостоятельно. Я рассматриваю упражнение, в котором говорится: «Применение выражения E является выражением формы (E E1, ... En). Это включает случай n = 0, соответствующий выражению (E). E является либо применением E, либо применением Curried application of E. "Новичок: Выполненные функции в схеме
(Edit:. Я исправил выше цитату ... Я изначально исказили определение)
Задача состоит в том, чтобы определить приложение выделанной процедуры, которая принимает значение 3 для
(define foo1
(lambda (x)
(* x x)))
Я действительно не понимаю идею здесь, и чтение статьи в Википедии о Curriying действительно не помогло.
Может ли кто-нибудь помочь с более ясным объяснением того, что просят здесь?
На самом деле даже дать мне ответ на эту проблему было бы полезно, так как после этого еще пять нужно решить. ... Я просто не понимаю основную идею.
Дополнение: Даже после длинного объяснения Брайана Кэмпбелла, я все еще несколько потерян.
Является ли (foo1 (sqrt 3)))
рассмотренным приложением foo и, следовательно, карри-приложение foo?
кажется слишком простым, но может быть ...
Typing (((foo1 2)) 2)
в DrScheme дает следующую ошибку (я вроде ожидаемый)
procedure application: expected procedure, given: 4 (no arguments)
После перечитывания What is Currying? я понимаю, что я также могу повторно -define foo1 быть:
(define (foo1 a)
(lambda (b)
(* a b)))
Итак, я могу ввести
((foo1 3) 4)
Но это на самом деле не получить меня ближе к производству 3 в качестве выходного сигнала, и кажется, что это на самом деле не выделки оригинальный foo1, это просто повторно определение Это.
Черт, 20 лет программирования C не подготовил меня к этому. :-) :-)
У вас есть несбалансированные двойные кавычки. Куда заканчивается ваша цитата? – Svante
Я обновил свой ответ с некоторыми разъяснениями и ответами на ваши изменения. Попытайтесь не думать о других определениях Currying, которые вы видите; это упражнение не означает определение функции Curried, но вместо этого применяется функция Curried. –
Пожалуйста, дайте мне знать, помог ли мой отредактированный ответ! Поскольку вы пытаетесь это узнать, я пытаюсь дать вам достаточно информации для решения проблемы, не решая ее самостоятельно; если вы хотите, чтобы я расширил свое объяснение вообще, я, конечно, согласен. –