Зигохистоморфный
типа в общем случае это будет скорее f . cata g вместо cata g
ну так есть же законы для катаморфизмов) ну и плюс не только cata юзать, а например другие схемы
Misha
это известный баг https://github.com/bos/criterion/issues/161 на snaphot 12.* не воспроизводится лень разбираться что именно там сломано
возможно, проблема лечится переходом с criterion 1.4 на 1.5, но может дело в транзитивных зависимостях
Зигохистоморфный
@kana_sama что знаю из последнего https://github.com/Lysxia/generic-recursion-schemes https://github.com/frerich/catamorphism
кана
ну так есть же законы для катаморфизмов) ну и плюс не только cata юзать, а например другие схемы
ну нет, я к тому, что я видел утверждение именно "через кату можно выразить все"
Зигохистоморфный
кана
нет, именно кату
кана
ну там было более специализированное утверждение "через foldr/reduceRight можно выразить все для работы со списком"
Mi Shа
Подскажите, а как называют софт для тестирования алгоритмов на правильность ( например, для соревновательного программирования )? И есть ли что-то подобное на Хаскелле?
Alexander
на хаскеле есть hspec, например
кана
это скорее всего да (но думаю не все)
не все, как я сказал, нужен так f . foldr g i
кана
например если мы сворачиваем в пару для стейта, а вернуть нужно первый элемент пары
Зигохистоморфный
кана
как
кана
в трансдьюсерах типа сделали для этого финализирующую функцию с одним аргументов, которая вызывается в конце
кана
какая альтернатива у алгебр?
Зигохистоморфный
f . foldr g a = foldr h b, where f a = b, f (g x y) = h x (f y)
Зигохистоморфный
какая альтернатива у алгебр?
ну а что плохого в f . cata alg?
кана
в том, что не подходит под утверждение "одной катой выразить все"
Зигохистоморфный
ну если f работает со скаляром каким-то, то ничего плохого не вижу, а так в другом случае можно алгебры складывать и компоузить как естественные преобразования
кана
да речь не в "плохое/хорошее"
кана
а собственно в корректности утверждения
Зигохистоморфный
@kana_sama если f что-то сродни катаморфизма и ее можно выразить через него, то тогда можно зафьюзить 2 алгебры в одну и заюзать катаморфизм только один
Alexander
Откуда вы все это знаете :/
Andrey
простите что вмешиваюсь в умные темы, напомните плиз, а filter у нас не генерализован каким-нибудь классом типов?
Andrey
и если нет то почему?
Зигохистоморфный
и еще https://hackage.haskell.org/package/compactable-0.1.2.2/docs/Control-Compactable.html
Andrey
ага, оно. просто подумалось что почему бы ему не быть, и как всегда в сабже оно уже есть
Зигохистоморфный
ну и mfilter из Control.Monad
Зигохистоморфный
в purescript они объединили несколько идей https://github.com/LiamGoodacre/purescript-filterable
Зигохистоморфный
еще есть http://hackage.haskell.org/package/filtrable-0.1.0.2/docs/Data-Filtrable.html но мне по душе, как в пурсе сделано
Ilya
не все, как я сказал, нужен так f . foldr g i
Если f -- произвольная, то это бесполезное (тривиальное) утверждение же
Ilya
Типа f . foldr (:) [] и всё (поправлено)
Ilya
f . foldr g a = foldr h b, where f a = b, f (g x y) = h x (f y)
Это уравнение что ли написано?:) А у него всегда решения есть?
Ilya
это rewrite rules для foldr
как понимать строчку f (g x y) = h x (f y) ?
Ilya
что-то не то с этим rewrite rule, кмк
Anonymous
@Readonlys будет жить. Поприветствуем!
кана
f . foldr g a = foldr h b, where f a = b, f (g x y) = h x (f y)
ну вот пусть f = show g = (+) a = 0 я хочу show . foldr (+) 0 по правилу я получую какой-то foldr h b, как получить эти h, b
кана
я вижу это невозможным без read например
Ilya
ну вот пусть f = show g = (+) a = 0 я хочу show . foldr (+) 0 по правилу я получую какой-то foldr h b, как получить эти h, b
Я ж говорю, там не rewrite rule, там полноценное уравнение на функцию h записано. В данном случае его решение это h x y = show (x + read y).
Ilya
Не во всех случаях оно разрешимо
Alexander
а у нас не появилось в современном Haskell возможности выбора по какой типопеременной траверс делать?
Alexander
скажем у меня есть: data Foo a b = Foo a | Bar b | Baz Q я хочу сделать traverse ioA2C >=> traverse ioB2D :: Foo A B -> IO (Foo C D)
A64m
в generic-lens есть
Зигохистоморфный
traverse @SomeType ioA2C >=> traverse @SomeType2 ioB2D мб как-то так
Alexander
в generic-lens есть
чего-то я боюсь их тащить
Alexander
@A64m_qb0 а где там?
A64m
param @1
Зигохистоморфный
не взлетит же это
ну ты подставь правильно) я просто как пример написать, юзать TypeApplications
Alexander
TypeApplication же не взлетит
Alexander
@A64m_qb0 так param @1 сделает мне правильный Traversal, а как мне теперь его "запустить"?
A64m
?
Alexander
traverseOf (param @1) function foo ?
Alexander
так как-то?
Alexander
@A64m_qb0 ^
A64m
не понял, зачем тут траверсоф
Alexander
у меня есть Foo A B, хочу сделать IO (Foo C D) пройдясь (A -> IO C) и (B -> IO D)
Alexander
или я тут туплю в ночи?
A64m
traverseOf = id
Alexander
а
Alexander
понял
A64m
param @1 и будет вместо traverse
Alexander
понял
Alexander
а если у меня больше вложенность Baz (Foo A B) -> IO (Bar (Foo C D)) ?
A64m
в Baz зайти сначала
Alexander
traverse ( (param @1) foo) ?
Alexander
теперь осталось понять хочу ли я этого всего
Alexander
но хотя бы идею понял
A64m
(traverse . param @1) f foo
Alexander
+
Alexander
поидее наиболее правильное решение у меня если есть зависимость от контекста, но тогда уже не получится так
Alexander
сейчас попробую по человечески написать:
Alexander
data Bar a = Bar U V a data Baz q b = BazL q | BazR b | Baz type Q = Bar (Baz K L) f :: U -> V -> K -> IO Щ g :: U -> V -> L -> IO Ц magic :: Q -> IO (Bar (Barz Щ Ц)
Alexander
@A64m_qb0 ^