• ненависть Haskell zipper Бля, какая тварь «додумалась» представлять зиппер для бинарного дерева как type Zipper = (BinTree a, [Context a])? Расстрелять нахуй из рекативных говномётов. Два раза!
    Зиппер это исключительно 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, И какая?
  • @Macil, а почему не?

    ```
    data Zipper a = Zipper
    { zValue :: a
    , zLeft :: Maybe (BinTree a)
    , zRight :: Maybe (BinTree a)
    , zTop :: [Either (T a) (T a)]
    } deriving (Show, Eq)
    ```
  • @qnikst, Э-э-э... Зиппер Шредингера? Одновременно в «левом» и «правом» состояниях?
  • @Macil, почему? тут хранится текущее значение (правда должно быть Maybe), левая ветка относительно текущего положения, правая ветка относительно текущего положения и путь наверх как список. Разницы в [Either t t] и A = L t | R t | [] я не особо не вижу :( во всяком случае такой, чтобы прям негодовать..
  • @qnikst, A = L t A | R t A | T естественно
  • @qnikst, с одной стороны наверное pattern-matching менее удобно писать, с другой стороны можно проще делать fold. Косвенность вроде та же
  • @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) зиппера.
    Кроме того, у зиппера для бинарного дерева нет «веток относительно текущего положения». С зипперами для хедж-деревьев всё сложнее, согласен. Фактически, зиппер для хедж деревьев, это два зиппера: условно говоря, зиппер «вверх-вниз» и зиппер «влево-вправо».
    Но что хедж-дерево легко кодируется в бинарное! Даже двумя различными способами. С громадным количеством плюшек в результате...
  • @Macil, Кроме того, у зиппера для бинарного дерева нет «веток относительно текущего положения»
    ни вижу ни одного обоснования для данного утверждения.
  • @qnikst, ??? Ну, у бинарного дерева есть только два поддерева. Поэтому возможны только два варианта, либо левое поддерево в фокусе, а правое в контексте, либо наоборот. А когда мы идем вверх, то мы тупо склеиваем левое и правое поддеревья, поскольку ничего другого просто нет в наличии.
  • @Macil, я привык общаться с zipper-ом когда у нас в фокусе значение, а не дерево. Если держать дерево — то ок.
  • @qnikst, впрочем уверенности, что мой подход верный у меня нет
  • @qnikst, А ведь точно, можно ведь фокусироваться и на значении! Что-то я этот вопрос совершенно протормозил... А где такие зипперы применяют?
  • @Macil, я только в задачах о том как нарисовать зиппер, в реальности не применял.
  • @qnikst, навскидку разница только в том, что у тебя в фокусе Maybe a, и ты можешь заменять значение на Nothing тем самым его удаляя, и проходиться по дереву удаляя значения без перестройки дерева, т.к. если в варианте с деревом ты его удаляешь, то тебе получается нужно мержить ветки сразу. Дальше сам на реальные юзкейсы накладывай
  • @qnikst, хотя блин.. при сдвиге фокуса все равно мержить надо.. в общем не знаю :)
  • @qnikst, Это действительно, очень интересный вопрос, какой подход правильный... В конце-концов, устоявшейся идиоматики вроде бы нет... И это — классно! Буду думать. Спасибо! И ответь, плз, еще в #2774277.