Рассмотрим односвязный список. Это похоже на
data List x = Node x (List x) | End
Естественно определить функцию складывания, такую как
reduce :: (x -> y -> y) -> y -> List x -> y
В некотором смысле reduce f x0
заменяет каждый Node
на f
и каждый End
на x0
. Это то, что прелюдия называется складкой.
Теперь рассмотрим простое двоичное дерево:
data Tree x = Leaf x | Branch (Tree x) (Tree x)
Аналогично естественно определить такую функцию, как
reduce :: (y -> y -> y) -> (x -> y) -> Tree x -> y
Обратите внимание, что это сокращение имеет совершенно другой характер; в то время как основанный на списках по сути является последовательным, этот новый, основанный на дереве, имеет больше чувства разделения и покоя. Вы даже можете себе представить, как добавить туда комбинаторов par
. (Где бы вы поместили такую вещь в версию списка?)
Мой вопрос: эта функция по-прежнему классифицируется как "складка", или это что-то еще? (И если да, что это?)
В принципе, всякий раз, когда кто-то говорит о сворачивании, они всегда говорят о сворачивающихся списках, который по своей сути является последовательным. Мне интересно, является ли "последовательный" частью определения того, что такое сгиб, или это просто совпадающее свойство наиболее часто используемого примера сгибания.