Size: a a a

2020 December 16

AV

Alexander Vershilov in Haskell
Если хождение не произвольное, то можно попытаться завязаться в узел
источник

MK

Maxim Koltsov in Haskell
Alexander Vershilov
Если хождение не произвольное, то можно попытаться завязаться в узел
Если в руках ленивость, любая проблема кажется узлом?
источник

AV

Alexander Vershilov in Haskell
Да
источник

AV

Alexander Vershilov in Haskell
А ещё если и RecursiveDo в руках!
источник

к

кана in Haskell
GNU/Vsevolod
Иммутабельный у меня не сработает, кеш должен шериться на все ветки обхода
вот решение без всяких монад (но неэффективное правда, все дерево обходит), с иммутабельным сетом
источник

к

кана in Haskell
писать такое неудобно
источник

к

кана in Haskell
тут виден общий паттерн Set Int -> (Bool, Set Int)
функция принимает сет, отдает результат и новый сет

вот это и есть State

newtype State s a = State (s -> (s, a))
источник

к

кана in Haskell
поэтому вот то же самое через State (так же неэффективно, потому что не прерываю выполнение)
источник

к

кана in Haskell
сделать эффективным легко, достаточно добавить монадный and, который не будет вычислять второй аргумент без необходимости
источник

G

GNU/Vsevolod in Haskell
кана
вот решение без всяких монад (но неэффективное правда, все дерево обходит), с иммутабельным сетом
Зачем здесь сет, если он используется только на листьях?
источник

к

кана in Haskell
а что поменяется, если добавить его в ноды?
источник

к

кана in Haskell
листок что, один только в дереве?
источник

G

GNU/Vsevolod in Haskell
кана
а что поменяется, если добавить его в ноды?
Кеш будет работать на поддеревья ноды
источник

G

GNU/Vsevolod in Haskell
кана
листок что, один только в дереве?
Нет, то этот сет не шарится между ветками
источник

к

кана in Haskell
не очень понимаю про какой кеш идет речь, задача определить, есть ли в дереве дубликаты, или нет?
источник

G

GNU/Vsevolod in Haskell
кана
не очень понимаю про какой кеш идет речь, задача определить, есть ли в дереве дубликаты, или нет?
нет, задача соптимизировать вычисления при обходе веток, останавливаясь, если ветка такого вида уже встречалась
источник

к

кана in Haskell
то есть кеш это не сет, а мапа?
источник

к

кана in Haskell
У нод есть какие-то уникальный айдишники?
источник

G

GNU/Vsevolod in Haskell
кана
то есть кеш это не сет, а мапа?
Это неважно в данном контексте. Если структуру можно хешировать, то не мапа
источник

к

кана in Haskell
так, хорошо, еще раз

есть какое-то дерево

раз нам нужно определять для каждой ноды, были ли мы в подобной ноде, то у ноды должны быть какие-то айдишники (иначе для вычисления идентификатора придется все поддерево обходить, что может не проблема конечно)

значит при входе в ноду мы смотрим, есть ли айдишник в сете, и если есть, то не идем дальше в ветки, иначе идем

Все верно?
источник