Alexander
сходу я вижу только постать что в хэндл
Alexander
но там твой вопрос опять возникнет
Alexander
как пробудится тред который читает сокет
Leonid 🦇
синхронизируйте треды через примитивы синхронизации
Alexander
учитывая что если все треды будут делать print $ last $ cycle 0
Alexander
то никогда
Alexander
так что я бы решал как-нить совсем по другому
Alexander
или не волновался
Denis
https://hackage.haskell.org/package/stm-delay-0.1.1.1/docs/Control-Concurrent-STM-Delay.html вот тут что-то оригинальное
Denis
а хотя это не про то
Alexander
registerDelay видел?
Alexander
в stm?
Alexander
а ну на него этот пакет ссылается
Alexander
у тебя все равно внутри через GHC.Event работает
Alexander
а ты ему не доверяешь
Denis
а почему там TVar Bool?
Cheese
а они в IEEE754 вообще есть?
binary16 binary32 binary64 binary128 binary256 decimal32 decimal64 decimal128
Denis
я чего-то вроде TVar (Maybe a) ожидал
Alexander
откуда там a?
Cheese
главное, что Float16 есть в моём ТЗ
Alexander
эта штука создает TVar, в котором False на True меняется
Alexander
можно делать что-то вроде registerDelay i >>= \d -> atomically (asum [readTVar d >>= check, ...])
Alexander
@cblp_su тут про какой-то пакет кметат говорили
Denis
откуда там a?
Давай бэктрекнемся - я асинки запускаю, но если они начинают в какой-то момент работать дольше определенного предела, меня перестает интересовать их возвращаемое значение и я хочу чтобы они прекратили делать то что они делают и отдали ресурсы. Они через TVar a мне какой-то a возвращают в stm.
Leonid 🦇
http://hackage.haskell.org/package/half-0.2.2.3/docs/Numeric-Half.html
Alexander
@catamorphism вот не слушал ты меня когда я на fprog spb рассказывал это (или я тогда про исключения чушь нёс)?
Alexander
а они работают или ждут?
Denis
они работают и мне надо чтобы CPU отдали и память
Alexander
как прибить сходу чет не вижу, как неслушать через registerDelay можно
Cheese
http://hackage.haskell.org/package/half-0.2.2.3/docs/Numeric-Half.html
мне это не в программе нужно, а в сериализации. впрочем, это тоже должно помочь, спасибо
Leonid 🦇
ну там storable есть как минимум
Alexander
always :: STM Bool -> STM () <- такая штука в stm была, но похоже её хотят выкинуть
Alexander
плюс в статье писали что раннее завершение возможно, но вроде не сделано
Alexander
т.е. killThread придётся кидать явно
Denis
ну я так и думал делать
Denis
вообще задачник бы по конкарренси в ghc
Denis
я б порешал
Alexander
вообще на threadDelay, registerDelay надеяться почи всегда можно
Alexander
+
Alexander
т.е. проблемы там будут только в патологических случаях
Alexander
у registerDelay меньше с исключениями проблем, т.к. там все в stm
Alexander
я бы делал registerDelay + запасной тред
Alexander
в одном из них atomically $ readTVar d >>= check) >> killThread
Alexander
в другом что надо но проверяя readTVar d >>= always
Denis
Хм, ну т.е. в каждом асинке по два ТВара, один из них для отсечки + Отдельный тред делающий по отсечке killThread
Denis
я вообще думал по другому
Denis
STM вообще убрать, т.к. retry не нужен тут. Отдельный тред в котором threadDelay и он все остальные просто килляет.
Alexander
одного твара должно хватить
Denis
Оу, а что за & такой в Prelude?
$ с флипнутыми аргументами
Alexander
retry - блокировка
Ю ли я? 🤔
Что-то он не хуглится
Alexander
threadDelay x = registerDelay x >>=\t -> atomically (readTVar t>>= check)
Alexander
но ты ещё к этому доп логику композить можешь
Alexander
вообще есть timeout где-то в base
Denis
удобен для обращения к рекордам в ООП стиле (то что в PureScript через точку делается)
Alexander
который IO a -> IO (Maybe a)
Alexander
но там есть проблемы с исключениями
Denis
во, кстати
Vladimir
Они формат таки сломали? Было же 24, точно помню
Там Rational же, а он из Integer'ов состоит. Короче, размер нефиксированный.
Denis
совсем забыл про него
Alexander
т.е. лучше делать это в секретном треде
Alexander
в который ничего не прилетит
Vladimir
Они формат таки сломали? Было же 24, точно помню
А, не, фигню сказал. Там не Rational, а разбивание на экспоненту и мантиссу, которые в Integer и Int представлены. Но всё равно размер плавающий.
кана
как-то можно проверить значение на явный error? понятно, что x = x не выявить, но x = error "" же как-то можно выявить
Влод
=== undefined
кана
это же не жиес
Alexander
никак
Alexander
ну можно попробовать вычислить evaluate и ловить исключения
Alexander
может каким-то чудом можно попробовать понять по адресу что там за символ
Denis
скорее так
Alexander
но это ты только error словишь максимум, а ещё есть всякие throw
Denis
но вообще это задача из серии тех, которые в коде здорового человека не требуют решения
Denis
хочется очень странного, короче
Alexander
Prelude> let x = 4 :: Int Prelude> let y = error "foo" :: Int Prelude> :printHeap x I# 4 Prelude> :printHeap y let f1 = _fun in (_bco *** Exception: Unknown opcode 0 CallStack (from HasCallStack): error, called at src/GHC/Disassembler.hs:237:18 in ghc-heap-view-0.5.10-HJQTJygTyws2hg4TLZ0ruL:GHC.Disassembler
Alexander
Prelude GHC.HeapView> getClosureRaw y (0x00007f98351c84a0,[140291702817968,283476979897,62,283489526080],[0x00000042014ae140])