-
Зиппер это исключительно type Zipper = (BinTree a, Context a), где data Context a = Top | L a (BinTree a) (Context a) | R a (BinTree a) (Context a) без сраных паттерн матчнигов по спискам!
Replies (16)
-
@Macil, почему? тут хранится текущее значение (правда должно быть Maybe), левая ветка относительно текущего положения, правая ветка относительно текущего положения и путь наверх как список. Разницы в [Either t t] и A = L t | R t | [] я не особо не вижу :( во всяком случае такой, чтобы прям негодовать..
-
@qnikst, Разницы, действительно нет никакой! С технической (!!!) точки зрения. А вот с дидактической... Запись
left (Node a l r, c) = (l, L a r c)
upl (l, L a r c) = (Node a l r, c)
, где l — левое поддерево, r — правое поддерево, c — Context, a — значение
намного более понятна и полнее показывает суть (tm) зиппера.
Кроме того, у зиппера для бинарного дерева нет «веток относительно текущего положения». С зипперами для хедж-деревьев всё сложнее, согласен. Фактически, зиппер для хедж деревьев, это два зиппера: условно говоря, зиппер «вверх-вниз» и зиппер «влево-вправо».
Но что хедж-дерево легко кодируется в бинарное! Даже двумя различными способами. С громадным количеством плюшек в результате... -
@qnikst, ??? Ну, у бинарного дерева есть только два поддерева. Поэтому возможны только два варианта, либо левое поддерево в фокусе, а правое в контексте, либо наоборот. А когда мы идем вверх, то мы тупо склеиваем левое и правое поддеревья, поскольку ничего другого просто нет в наличии.
-
@qnikst, навскидку разница только в том, что у тебя в фокусе Maybe a, и ты можешь заменять значение на Nothing тем самым его удаляя, и проходиться по дереву удаляя значения без перестройки дерева, т.к. если в варианте с деревом ты его удаляешь, то тебе получается нужно мержить ветки сразу. Дальше сам на реальные юзкейсы накладывай