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 это мне? А что это?
Зигохистоморфный
про alongside это мне? А что это?
https://www.stackage.org/haddock/lts-11.8/lens-4.16.1/Control-Lens-Lens.html#v: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 - не обязательно один и тот же тип.
Зигохистоморфный
Почему монады являются эндофункторами? Мы же можем из 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
Alexander
но проблемы есть
Alexander
если есть функция foo :: Int -> Int
Alexander
получить исключение внутри из-за tail печально
Alexander
но не то, чтобы банить использование функций навсегда
Alexander
или везде использовать NonEmpty
Ilya
получить исключение внутри из-за tail печально
да, но называть это "выстрелом в ногу" я бы не стал. Рантайм вполне доходчиво говорит, в чём проблема, а не делает втихую какую-то гадость.
Andrey
или дефолтное значение вместе с передавать
Alexander
Nil возвращать
Ilya
а что касается варианта с Maybe — с ним так же можно упасть
Alexander
welcome to clojure
Ilya
сделав \(Just h) -> h
Ilya
ну т.е. сигнатура head :: [a] -> Maybe a сама по себе никак не защищает от падения программы. Защищает от падения программы нормальная обработка кейсов Maybe — и Just, и Nothing. Но точно так же можно обработать два случая списка: пустой и не пустой. И в чём разница???
Alexander
вообще функция по типу которой неочевидно, что она падает это плохо
A64m
Почему люди часто возмущаются функциями head и tail? 🤔 В этом чате не раз слышал.
потому, что у хаскеля плохие сообщения об ошибках в рантайме
Kirill
да, но называть это "выстрелом в ногу" я бы не стал. Рантайм вполне доходчиво говорит, в чём проблема, а не делает втихую какую-то гадость.
у нас тут статическая типизация вроде, перетаскивать в рантайм не так чтоб кул, ну и с трейсами в хаскеле не так чтоб всё гладко в отличие от всяких строгих языков
Alexander
т.е. не надо использовать head где он падает
Andrey
ошибки не нужны
Ilya
у нас тут статическая типизация вроде, перетаскивать в рантайм не так чтоб кул, ну и с трейсами в хаскеле не так чтоб всё гладко в отличие от всяких строгих языков
ну поинт в том, что c head :: [a] -> Maybe a так же можно упасть в рантайме. хаскель никак не проверяет, что Nothing обработан
Kirill
мой пойнт был про частичные функции
Alexander
это invariant violation и все такое
Kirill
ты якобы его переборол введя ещё одну частичную
Kirill
ССЗБ
Andrey
добавьте к ним функцию с дефолтным значением, чтобы обходить краевые условия
IC
вообще проблемы с head/tail переоценены
Нифига. Регулярно имею с ними проблемы.
Kirill
1) делать кейс вместо head; 2) заиметь явные гарантии в коде и написать коммент коль хаскель не может вывести; 3) NonEmpty
Alexander
head нужно использовать только там где он действительно не падает, и есть инвариант
Alexander
проблема с ним что система типов этот инвариант не энфорсит никак
Andrey
в пурсе head вернёт Maybe a
Alexander
исключение нечитабельное
Ilya
в пурсе head вернёт Maybe a
а пурса гарантирует, что программист не забудет обработать Nothing?
A64m
нет конечно
Alexander
решений обычно несколько: возвращать Maybe (дурацкое), использовать NonEmpty
Andrey
ага, надо обработать Partial a
IC
head нужно использовать только там где он действительно не падает, и есть инвариант
И писать в документации почему этот инвариант исполняется. А лучшая документация это код.
Alexander
по врапперов типа NonEmpty на всех не напасешься
A64m
да и нонэмпти дурацкое
Andrey
unsafePartial $ fromJust