теперь примерчик с каррингом(приведение функции n аргументов к функции одного аргумента, возвращающей функцию n-1 аргументов) и функций высшего порядка(функции, оперирующие другими функциями):
(define (make-val-list v0 dv vN)
(define (make-list v)
(if (= v vN)
(cons v '())
(cons v (make-list (+ v dv)))))
(make-list v0))
(define A-list (make-val-list 1 1 3))
(define x-list (make-val-list 0.2 0.1 1.2))
(define (y A)
(lambda (x) (- (* A x) (tan (* pi (/ x 4))))))
(define y-list (map (lambda (A)
(map (y A) x-list))
A-list))
(display (map (lambda (ls) (apply max ls)) y-list))пример основан на примерно месяц-два назад промелькнувшей в этом подразделе темы про задачу на С++.
в данном коде функция от(x,A) сведена к функции y(A), возвращающей функцию от(х), т.е. ее можно было бы применять так:
(let ((A1 1) (x1 0.2))
((y A1) x1))карринг очень похож на замыкание как я понял, только замыкание проявляется в следующих действиях:
(define y1 (y 1)) ; создаст функцию (y1 x) = (- (* 1 x) (tan (* pi (/ x 4))))
(define y2 (y 2)) ; создаст функцию (y1 x) = (- (* 2 x) (tan (* pi (/ x 4))))
(y1 x1)
(y2 x1)в примере применялись функции высшего порядка map и apply, они работают следующим образом:
1) map применяет переданую ей в качестве переданного аргумента функцию к каждому элементу списка, переданного вторым аргументом, и возвращает список значений-результаттов применения, например
(define test-list '(-2 1 7 0 -5 4))
(map abs test-list)вернет список абсолютных величин значений списка test-list: (2 1 7 0 5 4)
2) apply применяет переданную ей в качестве первого аргумента функцию ко всем элементам списка, переданного вторым аргументом, как буд-то они(элементы списка) являются параметрами переданной функции, например функции
(max -2 1 7 0 -5 4)
(+ -2 1 7 0 -5 4)вернут максимальное значение и сумму значений переданных в качестве параметров соответственно. однако попытка вызвать их таким образом:
(max test-list)
(+ test-list)выдаст ошибку. это не очень удобно, когда, например, в ходе работы программы генерируется некий список значений, из которого потом нужно выбрать максимальное значение, или сумму подсчитать. ту-то и приходит на помощь функция apply, которая как-бы раскрывает список, т. е. выражения
(apply max test-list)
(apply + test-list)эквивалентны выражениям
(max -2 1 7 0 -5 4)
(+ -2 1 7 0 -5 4)соответственно.
и в завершении вернемся к каррингу. как видно из описания функции map она может оперировать только функциями одной переменной. вот тут-то к нам и приходит на помощь карринг =)
уже почти по традиции ссылка на правильно форматированный код:
http://openpaste.org/11622/