Alexander
но использовать его, наверное
Alexander
UX там пока более человечный и его больше людей умеют
Vladislav
Haskell Platform это вообще странное что-то
Alexander
для винды норм было
A64m
не было
Vladislav
Рекомендую ставить GHC nix-ом и cabal из исхдников
Alexander
да ну, все запускалось почеловечески
Alexander
сравнительно
Alexander
стек тоже норм стал, но сейчас вроде mingw2 там не обновляют?
Alexander
nix под виндой печален
A64m
платформа на винде не могла даже нетворк сбилдить
Vladislav
nix под виндой печален
Под Виндой нет рекомендаций
Vladislav
Я под NixOS
Alexander
ну я года 4 назад использовал, было норм HaskellR собирало
Alexander
и проекты с ним
Vladislav
Надо по-другому было сказать GHC системным пакетным менеджером, cabal из исходников
A64m
на винде нормально работал сноймано-митчелловский инсталлятор minghc и стек какое-то время, сейчас уже как повезет
Alexander
со стеком в среднем проще с людьми общаться
A64m
> GHC системным пакетным менеджером работающий совет для никсос и генты только, нет?
A64m
в остальных случаях с оговорками уже
Alexander
ну никс можно в любом дистре поставить
A64m
ну я про то что это не системным пакетным менеджером
Alexander
это да
Alexander
а то можно в Арч попасть ненароком
Alexander
или убунту без ppa
A64m
году в прошлом можно было спокойно начинающим стек рекомендовать, сейчас не все так однозначно уже
A64m
и не потому что появилось что-то лучше для начинающих
Alexander
в кабал-инстале прикольные фичи
Alexander
надо ещё сделать wrapper убирающий new, и по stack.yaml генерирующему проект
Alexander
я правда не знаю что там с installом
A64m
пока там все недоделано, два интерфейса к двум разным тулам в одном CLI и пока с ним ни один ленгвидж костыль не работает, начинающим я бы его рекомендовать не стал
Alexander
вот ленгвидж костыли это да, я все забываю что ими люди пользуются
Alexander
без них все обнозначнее
Cheese
что есть ленгвидж костыль?
A64m
ghc-mod intero hie и т.д.
A64m
на самом деле ghci сам ленгвидж костыль, правда не особо хороший в смысле фич, с ним и ньюбилд будет работать, но это вроде не мейнстрим интегрирования ленгвиджкостыля с редактором
A64m
жаль, что я не начинающий, столько хороших советов ото всех!
Yura
Hi folks
Yura
не подскажете либу где реализованы примитивы типа forever, но с конечным числом повторов и экспоненциально раструщим временем повтора
Yura
danke schön
Viacheslav
привет
Viacheslav
подскажите как правильно огранизовать работу с эксепшенами в таком коде botLoop :: LogIO m => ConduitChannel -> BrainCells -> m () botLoop chan cells = do (event, pushback) <- liftIO $ readChan chan liftIO $ async (do response <- processRequest cells event writeChan pushback response) botLoop chan cells
Viacheslav
грубо говоря есть такая вот рекурсия, где я жду какого-нибудь сообщения из канала, затем тут же стартуя новый async, передаю туда данные из канала и снова жду сообщения из канала
Viacheslav
хочется чтобы эксепшены форвардились из этих тредов в основной
Yura
async будет форвардить только если будет wait
Viacheslav
это я понимаю
Viacheslav
но я не очень понимаю, как сделать wait, чтобы ничего не блокировать
Yura
бери forkFinally и для Left делай throwTo e myThreadId
Cheese
увеличения таймаутов нет ни в одном из них
Cheese
но вообще это называется circuit breaker
Yura
ну retry умеет exponentialBackoff
Yura
вроде
Yura
в любом случае - спасибо :)
Alexander
вообще async $ trySome action >>= atomically . writeTMVar responseBox
Alexander
где trySome :: IO a -> IO ( Either SomeException a)
Alexander
а responseBox :: TMVar (Either SomeException a)
Alexander
в вызывающем треде either throwM pure =<< atomically (takeTMVar response)
Alexander
@termina1 ^
Viacheslav
на сколько параллельно должно быть, зачем там async?
Там может быть несколько последовательных запросов внутри, так что нужен
Alexander
ну не важно, то что выше все равно сработает
Alexander
смысл делаешь trySome в рабочем процессе результат отдаешь
Alexander
в получателе при чтении делаешь either throwM pure
Alexander
можно в внутрь своих методов запихать
Viacheslav
Ок, спасибо, попробую разобраться.
Alexander
имхо если нужно что то откладывать на значимое время в серверном ПО лучше это делать через редис / любое другое персистентное хранилище
Anonymous
@MikhailSubbotin будет жить. Поприветствуем!
Viacheslav
на самом деле кажется мне просто нужна функия link
Viacheslav
и в целом мой паттерн, когда мне нужно стартануть асинк, результат которого в этом треде меня не интересует, но я хочу привязать асинк к текущему треду (чтобы он пропагейтил эксепшены и убивал асинк, если тред помер) выражается как-то так withAsync action $ \a -> link a
Viacheslav
если я ничего не перепутал
Kirill
@termina1 а остальные действия треда у тебя внутри withAsync?
Kirill
иначе у тебяж после линка этот асинк убъётся