Что представляет собой складку для типов, отличных от списка?

Рассмотрим односвязный список. Это выглядит примерно так

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 комбинаторы там. (Где бы вы положили такую вещь в списке версии?)

Мой вопрос: эта функция все еще классифицируется как «складка» или это что-то еще? (А если так, что это?)

В основном, когда кто-то говорит о фолде, он всегда говорит о фолдесписки, который по своей сути является последовательным. Мне интересно, является ли «последовательное» частью определения того, что такое сгиб, или это просто случайное свойство наиболее часто используемого примера фолдинга.

Ответы на вопрос(4)

Ваш ответ на вопрос