Свёртка — объединение нескольких значений одной операцией. Примеры: вычислить сумму нескольких чисел, произведение нескольких чисел и т.д.
a • b • c • … • k
Здесь знаком •
обозначена некоторая двуместная операция.
Свёртка может быть правой и левой.
Правая свёртка:
a • (b • (c • (… • k)…))
Левая свёртка:
((…(a • b) • c) … • k)
Иногда для свёртки может быть определён некоторый нейтральный элемент z
:
((a • b) • c) = (((z • a) • b) • c)
(a • (b • c)) = (a • (b • (c • z)))
В Scheme некоторые операции обладают свойством свёртки, такие функции могут принимать произвольное количество параметров.
(+ 1 2 3 4)
→ 10
(* 1 2 3 4)
→ 24
(- 10 5 3)
→ 2
(/ 120 6 5)
→ 4
min
и max
: (min 3 8 2 5)
→ 2
, (max 3 8 2 5)
→ 8
.(append '(a b) '(c d e) '(f g))
→ (a b c d e f g)
.(string-append "ab" "cde" "fg")
→ "abcdefg"
.Особые формы (and …)
и (or …)
тоже обладают обладают свойством свёртки,
не смотря на то, что это не функции.
Для свёрток определена такая аксиома, что если op
— свёрточная операция, то
(op x) ≡ x
кроме -
и /
— (- x)
меняет знак числа, (/ x)
— вычисляет обратное значение.
Для ряда свёрточных операций существует нейтральный элемент. Он возвращается при вызове операции без параметров:
(+) → 0
(*) → 1
(append) → '()
(string-append) → ""
(and) → #t
(or) → #f
Для вызова свёрточных операций часто используется функция apply
:
(define xs '(1 2 3 4))
(apply * xs) → 24
(apply + xs) → 10
Помимо свёрточных операций (+
, *
и т.д.) в Scheme произвольное число
параметров принимают операции арифметических отношений:
(= 1 1 1) → #t
(= 1 2 1) → #f
(> 7 5 2) → #t
(> 7 5 5) → #f
(>= 7 5 5 2) → #t
...
Операции арифметических отношений не являются свёрточными, т.к. запись
вида (a < b) < c
бессмысленна, но здесь упоминаются для полноты картины.
Их тоже можно вызывать при помощи apply
.
Назначение функции apply
:
При помощи apply
невозможно вызвать and
и or
, поскольку они
не функции (попытка вызова будет ошибкой синтаксиса).