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