Alexander
@elemir90 хотя бы наличия monad mask и некомпозабельность, точнее композабельность с хаками
Alexander
в итоге получается переихоюретение исключений
Alexey
в итоге получается переихоюретение исключений
сложно новичку, столько терминов
Alexander
@elemir90 не новичок, а писать для новичков я не всегда умею
Alexander
:/
Евгений
Я забросивший хаскель олдфаг, лол. Про монадмаск почитаю. А под "композабельностью" ты понимаешь невозможность состакать a и b в ErrorT a (... (ErrorT b ...))?
Vasiliy
Vasiliy я не понимаю инстанса для ErrorT и почему он правильный..
я-то вообще ничего не понимаю, остаётся надеяться, что грамотные люди разберутся
Alexander
один кусок возвращает одну ошибку, другой другую, в итоге нужно делать mapEitherT или как там его и их в одну структуру
Alexander
Vasiliy release в bracket не отрабатывает в случае ошибки
Alexander
если я не устал и не туплю
Alexander
последнее вероятно
Vasiliy
обычно жалобы на то, что чтобы слепить вместе ErrorT x m и ErrorT y m, нужно делать сумму x и y
Alexander
+ case (eresource, eresult) of + (Left e, _) -> return $ Left e + (_, Left e) -> return $ Left e + (Right resource, Right result) -> runErrorT (release resource result))
Alexander
ну вон жалоба эта 4мя сообщениями выше
Alexander
а тут 2ой кейс
Alexander
для него мы не вызываем release
Евгений
обычно жалобы на то, что чтобы слепить вместе ErrorT x m и ErrorT y m, нужно делать сумму x и y
Объединение скорее. Потому что если пересечение типов x и y не пустое, то не надо его дважды включать
Евгений
Монадмаск это https://hackage.haskell.org/package/exceptions-0.8.3/docs/Control-Monad-Catch.html ?
Alexander
да
Alexander
у меня смутное ощущение что проблема была в mask а не bracket
Alexander
а понял
Vasiliy
там проблема в "if the base monad provides no ability to provide multiple exit"
Vasiliy
насколько я читал
Vasiliy
точнее, наоборот, в этом случае проблем не будет, они будут, если есть возможность нескольких выходов
Vasiliy
или как это по-русски сказать
Зигохистоморфный
да
в чем профит от монадмаск?
Alexander
можно использовать mask
Alexander
зачем mask и что такое асинхронные исключения знаешь?
Зигохистоморфный
можно пример?
Евгений
Даже я не знаю
Alexander
так начнем с асинхронных исключений
Alexander
это такие исключение, которые можно послать в другой тред
Alexander
соотв там в "произвольном месте" может возникнуть исключение что послали
Alexander
обычно используют для прерывания тредов, но иногда и какой-то message passing с прерыванием выполнения делают
Alexander
треду иногда не хочется чтобы его прибивали (как и в случае с сигналами), например хочется выделить ресурс и удалить в конце и чтобы ничего не помешало, или несколько действий которые должны быть все выполнены
Alexander
для этого есть mask :: (forall b . IO b -> IO b) -> IO a -> IO a
Alexander
так неправильно написал, ((forall b . IO b -> IO b) -> IO a) -> IO a
Зигохистоморфный
это наподобии метода withException?
Alexander
соотвественно мы вызываем mask $ \release -> ... и в ... не может возникнуь исключение
Alexander
release нужен чтобы снова разрешить исключению прилетать
Alexander
например bracket пишется как: bracket a r f = mask $ \release -> do x <- a ey <- try $ release x r x either throwIO return ey
Евгений
это такие исключение, которые можно послать в другой тред
Это наркомания какая-то. А какое теоретическое обоснование этого театра абсурда? В моё время исключение было просто разновидностью боттом-значения
Alexander
как попросить другой тред умереть?
Anatolii
Ну через костыли какие-то только
Alexander
глобальную переменную как в си которую тред должен поллить?
Anatolii
Это не та вещь которая нужна каждый день
Vasiliy
вот тут это всё очень годно расписано http://chimera.labs.oreilly.com/books/1230000000929
Anatolii
Но когда ты будешь рад
Vasiliy
Parallel and Concurrent Programming in Haskell By Simon Marlow
Alexander
да, марловская книга прекрасна
Alexander
да даже документации в Control.Exception хватит
Alexander
MonadMask соотвественно обобщает mask на разные монадки
Vasiliy
у него и мотивация, и сравнение с другими подходами описаны
Alexander
@elemir90 https://www.microsoft.com/en-us/research/wp-content/uploads/2016/07/asynch-exns.pdf
Alexander
но практика показывает что марловской книги людям не всегда достаточно :(
Alexander
@anpryl я думаю даже в вашей кодобазе это используется часто :)
Anatolii
Я такого не видел!
Anatolii
😀
Евгений
Ладн, почитаю. Хотя так просто не могу придумать никакого пьюр-обоснования
Alexander
@anpryl все таймауты например
Vasiliy
я, честно говоря, её по-диагонали прочитал, но мне хватило, чтоб понять, что надо иметь в виду асинхронные исключения и использовать bracket
Alexander
сейчас часто за async прячется
Alexander
типа race a b и все счастливы, а то что там MVar и асинхронные исключения, ну кому это важно?
Alexander
@elemir90 в статье только старый API
Alexander
block/unblock
Alexander
вместо mask
Alexander
это все естественно для базовых монадок типа ST/STM/IO
Vasiliy
а кроме IO исключения возникнуть нигде и не могут же
Vasiliy
а, есть же seq
Anatolii
Сегодня получился хороший поучительный вечер 😀
Alexander
ну асинхронное исключение может прилететь когда угодно
Alexander
т.е. ты прав, но как бы это сказать
Alexander
если сделать case somethingPure of ... то вот пока у нас матчится somethingPure там может прилететь исключение, если есть аллокации
Alexander
@elemir90 посмотрел примеры зачем это может надо быть? там во вступлении
Евгений
@elemir90 https://www.microsoft.com/en-us/research/wp-content/uploads/2016/07/asynch-exns.pdf
Ну такое, они семантику через пи-калкулус строят
Евгений
Ну зачем это нужно я и так могу придумать. Интереснее было как можно было выкрутится, чтобы реализовать такое, не отходя от чистой лямбды. Спойлер: никто и не пытался
Vasiliy
если сделать case somethingPure of ... то вот пока у нас матчится somethingPure там может прилететь исключение, если есть аллокации
ну да, это всегда надо учитывать, я лично всё либо в bracket заворачиваю, либо в resourcet, если много всего
Alexander
ну жизнь же сложнее, особенно если всякая сеть/MVar/STM вокруг
Alexander
т.е. проблемы конкурентности не сводятся к деаллокации ресурсов