Что представляет собой складку для типов, отличных от списка?
Рассмотрим односвязный список. Это выглядит примерно так
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
комбинаторы там. (Где бы вы положили такую вещь в списке версии?)
Мой вопрос: эта функция все еще классифицируется как «складка» или это что-то еще? (А если так, что это?)
В основном, когда кто-то говорит о фолде, он всегда говорит о фолдесписки, который по своей сути является последовательным. Мне интересно, является ли «последовательное» частью определения того, что такое сгиб, или это просто случайное свойство наиболее часто используемого примера фолдинга.