кана
Ну у меня он почти и не отличается кроме двух моментов: - добавляется запаковка в Endo (а для этого значение еще и превращается в эндоморфизм (2 -> (2:)), а на выходе еще и разворачивается из End
Зигохистоморфный
toListOf практически не отличается от view
Ну вот я view сделал через listOf
кана
Каким образом? head? А если пустой массив вернется? Ошибка в рантайме же будет
Зигохистоморфный
Это ты кому?
кана
тебе
Зигохистоморфный
Пардон)
Зигохистоморфный
view l = foldMapOf l id
Зигохистоморфный
А фолдроф через фолдмапоф
Зигохистоморфный
А листоф через фолдроф
Зигохистоморфный
Vasiliy
вот здесь
Vasiliy
Чет у меня получился какой-то сложный toListOf toListOf :: Optic (->) (K (Endo [a])) s s a a -> (s -> [a]) toListOf lens = flip appEndo [] . getK . lens (K . Endo . (<>) . (:[]))
Vasiliy
K (Endo [a])
Зигохистоморфный
hs toListOf :: Optic (->) (K (Endo [a])) s s a a -> (s -> [a]) toListOf l = foldrOf l (:) []
кана
такая сигнатура по условию, но в либе она такая же
кана
type Getting r s a = (a -> Const r a) -> s -> Const r s toListOf :: Getting (Endo [a]) s a -> s -> [a]
Vasiliy
гм... ну ладно
Aleksei (astynax)
одноразовая если только
Чем многоразовая хуже? Вроде работает: λ> take 10 $ [1..] ++ [1..] ++ [1..] [1,2,3,4,5,6,7,8,9,10] λ> take 10 $ [1..] ++ ([1..] ++ [1..]) [1,2,3,4,5,6,7,8,9,10] λ> take 10 $ ([1..] ++ [1..]) ++ [1..] [1,2,3,4,5,6,7,8,9,10]
Aleksei (astynax)
Да, будет проталкивание через слои функций, но всё же
Aleksei (astynax)
Немного длинных списков конкатить можно вполне, вот много коротких - уже ниочень
Alexander
ну называть быстрой операцию, которая делает проход по списку квадратичным это странно
Aleksei (astynax)
Всё равно будет сравнительно неплохо, если сравнить с энергичными языками, где односвязные списки конкатить всегда дорого :)
Aleksei (astynax)
Каждый следующий конкат будет проталкивать значения по одному. Да, каждый слой пройдёт по своему первому слагаемому (лениво), прежде чем вернёт второе. Но на этом накладные расходы вроде бы и заканчиваются
кана
-- | A helper function which witnesses the fact that any -- container which is both a Functor and a Contravariant -- must actually be empty. coerce :: (Contravariant f, Functor f) => f a -> f b coerce = error "todo" Как это реализовать можно в принципе?
кана
fmap (const undefined) разве что, или даже просто fmap undefined
кана
если не упадет, значит контейнер пустой
Зигохистоморфный
а вообще я такое сделал contramap (const ()) . void
Зигохистоморфный
но насколько я помню это phantom https://www.stackage.org/haddock/lts-9.6/contravariant-1.4/src/Data.Functor.Contravariant.html#phantom
Alexander
это lensmaker?
кана
yep
Alexander
хм.. инетерсно у меня не реализовано
Зигохистоморфный
я кидал там список сверху
Alexander
ну зачем решение сразу кидать
Alexander
кто ж так делает :/
Зигохистоморфный
я не про решение)
Зигохистоморфный
я про список
кана
не ну вполне работает coerce :: (Contravariant f, Functor f) => f a -> f b coerce = fmap undefined -- | A Fold which views the result of a function application to :: (a -> b) -> Fold a b to f = \pure' -> coerce . pure' . f
кана
как правильно называть первый аргументы оптик (a -> f b)? next? До того, как я понял, как они композируются, называл pure', потому что она как бы поднимала значение, но это не совсем верно
кана
Оооо, только что получил бесценный опыт. Был такой код: _flip :: Iso (a, b) (a, b) (b, a) (b, a) _flip pure' (a, b) = fmap swap (pure' (b, a)) Все вроде нормально, но не тайпчекается, потому что в Iso указано, что pure' - не функция ((b, a) -> f (b, a)), а профунктор p (b, a) (f (b, a)), а профункторы конечно применять нельзя. Минут 10 ломал голову, что мне делать. Решение простое, конечно, нужно просто писать в point-free, при это использовать не композицию, а ее обобщение на профункторах, а именно lmap/rmap/dimap. Собственно, как я понял, point-free - единственный способ работать с профункторами _flip :: Iso (a, b) (a, b) (b, a) (b, a) _flip = dimap swap (fmap swap)
кана
Вроде все поверхность обошел, линзы, траверсалы, фолды, изо, осталосись только призмы. А там какие-то козвезды и я не понимаю типы вообще. А все, что до этого было, можно было придумать и реализовать исключительно по типам
Alex
звезда/козвезда это тривиальные профункторы
кана
ну вот ее я сделать и не могу, все остальные тесты проходят
Alex
у которых один из мапов - id
кана
p (Either a c) (Either b c) ? Так, это choice
кана
Я правильно понимаю, что при генерации призм lens не делает линзы для полей конструкторов?
Artyom
да
кана
вот пример. Я хочу получить список имен, но _Cat отдает кортеж и приходится довольствоваться _1/_2
Artyom
_Cat._1 замени просто на name
кана
вау
кана
спасибо
Artyom
кстати, можно было второму _name штрих не добавлять
Artyom
а, хотя тогда собаки тоже попадут
Artyom
а тебе это не надо, наверно
кана
куча магии появляется)
Artyom
хотя-хотя я бы все равно штрих не добавлял, а вместо этого сделал traverse . filtered (is _Cat) . name
Artyom
так даже вроде и понятнее
Artyom
наверно, можно как-то без filtered сделать, но сходу не придумал
Evgeny
Народ, а как феншуйно парсить JSON, в котором могут быть, а могут не бывать пары ключ-значение с заранее неизвестными именами ключей?
Evgeny
Использовать в коде тип словаря?
Dmitry
ну логично же?
Evgeny
Логично, но вопрос про феншуй:-) вдруг чего-то не знаю
Alexander
в Value и хранить
Alexander
самый общий метод
Alexander
там можно весь json хранить в котором неизвестно что
Alexander
если есть какая-то информация о структуре и типах то уже использовать более точные типы
Aleksei (astynax)
Value подойдёт, если типы значений тоде неизвестны. А если известны, то лучше сразу в HashMap декодить
Alexander
"а если есть какая-то информация о структуре и типах то уже использовать более точные типы"
Evgeny
Ок, понял, спасибо.
Evgeny
У меня кусок данных, видимо, в словарь пойдет
Зигохистоморфный
filtered (is _Cat) не нужно. Достаточно traverse . _Cat . name
и будет такое? me ^.. friends.traverse.pets.traverse._Cat.name
Aleksei (astynax)
типа того, да