Sergey
https://pbs.twimg.com/media/DdBhSO4WkAUtaXq.jpg:large
Sergey
блин, обрезали на самом интересном месте (
Dmitry
Можно как-то красиво сделать линзу по двум полям, если есть линзы по обоим полям? Я могу сделать get и set для двух полей, потом lens2 = lens get set. Красивее можно?
Зигохистоморфный
Dmitry
есть запись, линзы по полям. Хочу иметь линзу по двум полям.
A64m
alongside ?
Dmitry
хм, правда, чего я хочу? :-)
Dmitry
видимо, чтобы была линза по (f1,f2)
Зигохистоморфный
только глянул на alongside)
Dmitry
про alongside это мне? А что это?
Dmitry
да, спасибо!
Зигохистоморфный
можно конечно сделать так, что модификацию применять по нескольким полям, но тип у них должен быть одинаков
Зигохистоморфный
(~&~) = liftA2(>=>)
data A = A { _a :: Int, _b :: Int } deriving Show
makeLenses ''A
a1 = A 10 20
a1 & (a ~&~ b) %~ (*3)
Aleksei
Почему монады являются эндофункторами? Мы же можем из Monad A сделать Monad B, где A и B - не обязательно один и тот же тип.
Зигохистоморфный
catostrophe
чтобы join можно было сделать
catostrophe
Но вот папир, где это не обязательно: https://arxiv.org/abs/1412.7148
кана
Aleksei
Понял. А моноидность откуда появилась? Между монадами должна быть какая-то моноидальная опеарция определена, а также нейтральный элемент.
кана
композиция
кана
перепиши join как естественное преобразование, чтобы увидеть морфизмы в категории эндофункторов
кана
type f ~> g = forall a. f a -> g a
join :: m (m a) -> m a
join :: (m . m) a -> m a
join :: m . m ~> m
pure :: a -> m a
pure :: Identity a -> m a
pure :: Identity ~> m
pure :: 1 ~> m
Зигохистоморфный
Compose/Identity
Aleksei
Спасибо
Зигохистоморфный
https://github.com/tommythorn/Reduceron
Alexander
А я слышал про этот проект.
A64m
его не так давно кто-то гальванизировал
A64m
а, ну собственно это этот форк и есть
Ilya
Почему люди часто возмущаются функциями head и tail? 🤔
В этом чате не раз слышал.
Kirill
частичные функции - способ выстрелить себе в ногу
Alexander
можно как то в hasql получить имя колонки по идексу аля postgresql-libpq?
тот
хаскелл + телеграм бот библиотеки интересно найти, имеет смысл в чат спрошивать или все должно быть на hackage?
Alexander
ну или вообще как решается типовая задача "распарсить row в рекорд"?
IC
Alexander
или в hasql не принято использовать 'select *'?
Alexander
CC @wormholio
Alexander
вообще проблемы с head/tail переоценены
Ilya
частичные функции - способ выстрелить себе в ногу
Эксепшн это выстрел в ногу? Что-то новенькое. По моему понимаю, выстрел в ногу, это когда произошла ошибка, но программа продолжает работать вместо падения. Неаккуратное обращение с указателями в си++, например.
Alexander
а то некоторые вводят только безопасные варианты с Maybe или хуже того 100500 вариантов, как safe
Ilya
Alexander
но проблемы есть
Alexander
если есть функция foo :: Int -> Int
Alexander
получить исключение внутри из-за tail печально
Alexander
но не то, чтобы банить использование функций навсегда
Alexander
или везде использовать NonEmpty
Andrey
или дефолтное значение вместе с передавать
Alexander
Nil возвращать
Ilya
а что касается варианта с Maybe — с ним так же можно упасть
Alexander
welcome to clojure
Ilya
сделав \(Just h) -> h
Ilya
ну т.е. сигнатура head :: [a] -> Maybe a сама по себе никак не защищает от падения программы. Защищает от падения программы нормальная обработка кейсов Maybe — и Just, и Nothing. Но точно так же можно обработать два случая списка: пустой и не пустой. И в чём разница???
Alexander
вообще функция по типу которой неочевидно, что она падает это плохо
A64m
Alexander
т.е. не надо использовать head где он падает
Andrey
ошибки не нужны
Ilya
Kirill
мой пойнт был про частичные функции
Alexander
это invariant violation и все такое
Kirill
ты якобы его переборол введя ещё одну частичную
Kirill
ССЗБ
Andrey
добавьте к ним функцию с дефолтным значением, чтобы обходить краевые условия
Ilya
Alexander
Kirill
1) делать кейс вместо head; 2) заиметь явные гарантии в коде и написать коммент коль хаскель не может вывести; 3) NonEmpty
Alexander
head нужно использовать только там где он действительно не падает, и есть инвариант
Alexander
проблема с ним что система типов этот инвариант не энфорсит никак
Andrey
в пурсе head вернёт Maybe a
Alexander
исключение нечитабельное
A64m
нет конечно
Alexander
решений обычно несколько:
возвращать Maybe (дурацкое), использовать NonEmpty
Andrey
ага, надо обработать Partial a
Alexander
по врапперов типа NonEmpty на всех не напасешься
A64m
да и нонэмпти дурацкое
Andrey
unsafePartial $ fromJust