parket
Что за _blah? :)
Pavel
parket
👍 Спасибо!
Alexander
о, stack в полезных ссылках
Cheese
parket
Евгений
Надо закрепить информацию о закреплённом сообщении
Cheese
нет, я не упрекаю, просто подсказываю, как можно быстрее находить ответы
Alexander
Alexander
@elemir90 так?
Евгений
Надо тогда уж первым предложением
Alexander
тогда не хвостовая рекурсия
Alexander
rec = rec » info а тут rec = info » rec
Alexander
оно конечно бесмысленно
A64m
> nofib shows only small differences of about +/- ~0.5%
> containers: ~1.5% faster
> aeson: ~2% faster
> megaparsec: ~2-5% faster
> xml library benchmarks: 0.2%-1.1% faster
> vector-benchmarks: 1-4% faster
> text: 5.5% faster
КЛАССИКА НОФИБА
Anonymous
@uhbif19 будет жить. Поприветствуем!
kosc
Dratuti!
Сергей
странное для себя встретил:
-- | Hylomorphism is anamorphism followed by catamorphism.
hylo :: Functor f => (f b -> b) -> (a -> f a) -> (a -> b)
hylo phi psi = cata phi . ana psi
откуда тут берётся тип b, Как вообще они композируются если выход ana - f b, а вход cata - f a ?
http://hackage.haskell.org/package/data-fix-0.2.0/docs/Data-Fix.html
Ilya
ana строит Fix f, а используется как seed, но в результате его нет
Ilya
cata сворачивает Fix f в b
Ilya
Ilya
композируются-то не алгебра и ко-алгебра, а ana psi :: a -> Fix f и cata phi :: Fix f -> b
Сергей
да, но всё равно не ясно. Тип точки никуда не делся:
λ :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
тут b должно быть одинаковым.
А! всё, увидел, да, композируются не (a -> f a), (b -> f b)
Ilya
*deleted*
ну, положим, forall там на самом верху
Ilya
Сергей
да, щёлкнуло
кана
psi :: Int -> Maybe Int
psi n | n > 0 = Just (n - 1)
psi _ = Nothing
phi :: Maybe String -> String
phi Nothiing = "Z"
phi (Just x) = "S(" ++ x ++ ")"
cata phi :: Fix Maybe -> String
ana psi :: Int -> Fix Maybe
f :: Int -> String
f :: cata phi . ana psi
f 3 == "S(S(S(Z)))"
далее очевидно
кана
Опоздал
Сергей
Спасибо!
Ilya
А пара и апо морфизмы нафига нужны?
Зигохистоморфный
А пара и апо морфизмы нафига нужны?
апоморфизм - анаморфизм для непустых структур, например для NonEmpty (тут надо самому строить условие)
параморфизм - катаморфизм, который параллельно несет информацию о оригинальной структуре
Зигохистоморфный
например dropWhile ты не напишешь с cata
Ilya
Зигохистоморфный
ну и инсерт не сделать через ana
кана
Хм, оригинальной или остаточной?
Зигохистоморфный
Зигохистоморфный
catamorphism - общая модель структурной рекурсии
anamorphism - общая модель структурной корекурсии
paramorphism - общая модель примитивной рекурсии
apomorhism - общая модель примитивной корекурсии
в para - Tuple
в apo - Either
что тоже дуализмы
Зигохистоморфный
cata :: Functor f => (f b -> b) -> Fix f -> b
ana :: Functor f => (a -> f a) -> a -> Fix f
para :: Functor f => (f (Fix f, c) -> c) -> Fix f -> c
apo :: Functor f => (b -> f (Either (Fix f) b)) -> b -> Fix f
в apo Left ведеть себя также как и в
https://www.stackage.org/haddock/lts-12.8/extra-1.6.9/Control-Monad-Extra.html#v:loop
Зигохистоморфный
кстати как вариант, попробуйте написать через ana
toList :: forall a. RoseTree a -> [a]
ну перед этим представив RoseTree через Fix
Ilya
Ilya
Я писал помню, для разных вариантов обхода
Ilya
Хотя подожди, зачем тут вообще RoseTree через фикс представлять?
Ilya
ana должна билдить структуру, у тебя на выходе список, значит речь идёт об ana для списка, то есть unfoldr
Ilya
Значит не имеет смысла RoseTree переписывать через Fix, функтор для ana тут ListF, а не RoseTreeF
Ilya
Зигохистоморфный
Зигохистоморфный
Ты потеряешь один элемент из дерева
Ilya
Ладно, я писал не для Tree a, я писал для Forest a
Ilya
Вспомнил
Ilya
Что практически одно и то же, но Forest a может быть пустым, да:)
Ilya
Forest который отсюда http://hackage.haskell.org/package/containers-0.6.0.1/docs/Data-Tree.html
кана
кана
а то вроде ана, а функтор на вход
Зигохистоморфный
кана
toList :: Fix (RoseTreeF a) -> [a]
то есть мы принимаем фикс на вход по заданию, а ана отдает, собственно про это я и спросил, мол мб ты имеешь в виду ану для списка
Зигохистоморфный
нет же
Зигохистоморфный
свернуть RoseTree в список через анаморфизм
кана
ты не понял вопрос
кана
ana :: Functor f => (a -> f a) -> a -> Fix f
кана
какой F ты хочешь увидеть в решении?
Ilya
Просто лишняя была добавка "представьте RoseTree через Fix"
кана
да, это запутывает
кана
типа на самом деле реализация RoseTree вообще не важна задача оказывается
Зигохистоморфный
кана
кана
не отвечай вопросом на вопрос, я сейчас не решение генерю, а УСЛОВИЕ хочу понять
кана
потому что в условии ты сказал про розтри через фикс, что подразумевает, что мы должны работать с функтором RoseTreeF
но потом ты говоришь про ану, которая генерит структуру, а сгенерить нужно список
кана
то есть я так понимаю ты хочешь ListF в качестве функтора для аны, а не ReseTreeF
Зигохистоморфный
RoseTree a -> ListF a (RoseTree a)
кана
тогда зачем вообще было нужно уточнение про фикс?
кана
что фикс меняет тут?
кана
для дерева