
Lazzlo
12.06.2017
14:57:19
Понял, а что ты юзаешь?

Max
12.06.2017
14:59:01
У меня Э-к, сокеты для устройств, web-сокеты для дальнего интерконнекта (если на обоих оконечниках Э-к).
http://gearman.org/
http://nanomsg.org/
- ссылочки в тему :)

Lazzlo
12.06.2017
15:05:12
Окей спасибо большое

Google

Max
12.06.2017
15:09:20
А, да, еще отдельный цирк, когда сеть далека от тепличных условий. И когда требуется соблюсти порядок доставки сообщений.

Alexander
12.06.2017
15:17:29
в хацкель у него ещё и евентпол отдельный

Max
12.06.2017
15:19:47
А, да. Если падает zeromq - то падает вся аппликушка.
А оно падает... ну, не сильно редко.
Поэтому все делать надо с расчетом, что в любой момент прилетит.

Alexander
12.06.2017
15:44:13
да сигаборт на фейле какой-то операции меня порадовал
у меня сейчас проблема что он фд не закрывает хотя должен
и я в лимит влетаю

Max
12.06.2017
15:54:40
Огонь

Alexander
12.06.2017
15:57:08
собственно вместо того чтобы выдать ошибку он абортится
я боюсь что там паттерн использования кривой

Denis
12.06.2017
16:34:41
ReaderT наше все?) https://www.fpcomplete.com/blog/2017/06/readert-design-pattern

Alexander
12.06.2017
17:00:12
ReaderT Env IO хорошая штука и правильно пишет, а после как обычно какую-то хреноту

Google

Alexander
12.06.2017
17:00:24
ну т.е. не совсем хреноту, а как обычно
интересно, а то, что я с FP complete-овками разговаривал объясняя как мы используем такой паттерн повлияло на блог или нет

Dmitry
12.06.2017
17:18:29
@qnikst А можешь пояснить, что за хренота? Ну, в смысле, что как и обычно

Denis
12.06.2017
17:19:43
ReaderT Env IO удобно читать окружения, конфиги я так понял
это же вроде в Servant?

Alexander
12.06.2017
17:24:42
в общем ReaderT Env IO это половина того, что всегда надо
HasFoo класс типов это тоже хорошо, но я бы и методы в класс типов засунул т.к. можно переопределить иногда это важно
unsafePerformIO и котята это неверно, иногда оно очень надо
ну и там про State и ещё что-то странные размышления
то, что WriterT это монада для создания space leaks это верно (у него немного не так но смысл верный)
ну и его можно сделать правильным если через стейт написать, а стейт сам пофиксить или взять последние tf

Dmitry
12.06.2017
17:46:00

Alexander
12.06.2017
17:47:44
ну поидее writer не делает создает зависимость в собираемой части из-за этого проблемы
решается переписыванием через стейт
но там *> возникает

Vladimir
12.06.2017
17:48:29

Alexander
12.06.2017
17:48:47
а т.к. по дефолту *> пишется через <*> (в непоследних tf) то там форсится значение где не надо
в итоге память все равно выжирается
но это исправляется специальным *> для стейта
@async_prince IO a -> a

Google

Alexander
12.06.2017
17:49:50
под локом
т.е. можно сделать thunk с IO действием в чистый контекст
там есть ряд проблем, и лучше не понимая что ты делаешь не трогать

Vladimir
12.06.2017
17:51:36

Alexander
12.06.2017
17:54:33
а..
ну в топике что выше снойман написал, что котёнок умирает, когда это используют

Anatolii
12.06.2017
18:00:30
а чем EitherT не угодил?
мне нравится идея разделения на ошибки приложения и на все остальное(IO)

Denis
12.06.2017
18:04:34
наверное в пользу ExceptT?

Alexander
12.06.2017
18:05:30
ExcepT поверх IO кучу проблем приносит
отсутствие MonadMask как минимальное
в итоге это заканчивается переизобретением исключений
у Сноймана есть статья но этому поводу (как обычно biased и opionated),\ но норм

Alexander
12.06.2017
18:07:00
он там доказывает для это бесполезно
я согласен что оно бесполезно для юзера либы, с другой стороны для пишущего либу есть плюсы, он видит, с чем он может валиться и что будет выше обработано пользователем, все остально нужно через throwM
часто ли такое случается - если честно не знаю

Vasiliy
12.06.2017
19:00:03
возможно, ExceptT и ErrorT станут экземплярами MonadMask https://github.com/ekmett/exceptions/pull/59

Евгений
12.06.2017
19:05:13
ExcepT поверх IO кучу проблем приносит
Каких проблем, не очень понимаю?
По мне так исключения это дётихак. Не такой страшный как unsafePerformIO, но всё равно: чем ближе код к тайп-сейфному, тем лучше.

Alexander
12.06.2017
19:06:30
Vasiliy я не понимаю инстанса для ErrorT и почему он правильный..
@elemir90 хотя бы наличия monad mask и некомпозабельность, точнее композабельность с хаками
в итоге получается переихоюретение исключений

Google

сегодня
12.06.2017
19:11:28

Alexander
12.06.2017
19:11:49
@elemir90 не новичок, а писать для новичков я не всегда умею
:/

Евгений
12.06.2017
19:13:44
Я забросивший хаскель олдфаг, лол. Про монадмаск почитаю. А под "композабельностью" ты понимаешь невозможность состакать a и b в ErrorT a (... (ErrorT b ...))?

Vasiliy
12.06.2017
19:16:40

Alexander
12.06.2017
19:16:46
один кусок возвращает одну ошибку, другой другую, в итоге нужно делать mapEitherT или как там его и их в одну структуру
Vasiliy release в bracket не отрабатывает в случае ошибки
если я не устал и не туплю

Admin
ERROR: S client not available

Alexander
12.06.2017
19:17:44
последнее вероятно

Vasiliy
12.06.2017
19:17:53
обычно жалобы на то, что чтобы слепить вместе ErrorT x m и ErrorT y m, нужно делать сумму x и y

Alexander
12.06.2017
19:19:20
+ case (eresource, eresult) of
+ (Left e, _) -> return $ Left e
+ (_, Left e) -> return $ Left e
+ (Right resource, Right result) -> runErrorT (release resource result))
ну вон жалоба эта 4мя сообщениями выше
а тут 2ой кейс
для него мы не вызываем release

Евгений
12.06.2017
19:20:01
Монадмаск это https://hackage.haskell.org/package/exceptions-0.8.3/docs/Control-Monad-Catch.html ?

Alexander
12.06.2017
19:21:07
да
у меня смутное ощущение что проблема была в mask а не bracket
а понял

Google

Vasiliy
12.06.2017
19:23:47
там проблема в "if the base monad provides no ability to provide multiple exit"
насколько я читал
точнее, наоборот, в этом случае проблем не будет, они будут, если есть возможность нескольких выходов
или как это по-русски сказать

Denis
12.06.2017
19:27:38
да
в чем профит от монадмаск?

Alexander
12.06.2017
19:27:48
можно использовать mask
зачем mask и что такое асинхронные исключения знаешь?

Denis
12.06.2017
19:28:15
можно пример?

Евгений
12.06.2017
19:28:22
Даже я не знаю

Alexander
12.06.2017
19:29:32
так начнем с асинхронных исключений
это такие исключение, которые можно послать в другой тред
соотв там в "произвольном месте" может возникнуть исключение что послали
обычно используют для прерывания тредов, но иногда и какой-то message passing с прерыванием выполнения делают
треду иногда не хочется чтобы его прибивали (как и в случае с сигналами), например хочется выделить ресурс и удалить в конце и чтобы ничего не помешало, или несколько действий которые должны быть все выполнены
для этого есть mask :: (forall b . IO b -> IO b) -> IO a -> IO a
так неправильно написал, ((forall b . IO b -> IO b) -> IO a) -> IO a

Denis
12.06.2017
19:32:43
это наподобии метода withException?

Alexander
12.06.2017
19:33:02
соотвественно мы вызываем mask $ \release -> ... и в ... не может возникнуь исключение
release нужен чтобы снова разрешить исключению прилетать
например bracket пишется как:
bracket a r f = mask $ \release -> do
x <- a
ey <- try $ release x
r x
either throwIO return ey

Евгений
12.06.2017
19:34:21