Misha
код, который я выложил, оказался плохой, там возникает дедлок, если потоков больше двух. Интересно было бы понять, почему, но лучше взять библиотечную функцию
Misha
хотя судя по исходникам, это не совсем то
Misha
В конечном счете сделал через Async, там никаких дедлоков не возникает http://lpaste.net/340541
Alexander
Alexander
нету гарантии что только 1 раз запустится тред
Alexander
нету гарантии, что не перепишется, то, Value на Promise
Alexander
хотя почему там deadlock сходу не вижу
Alexander
ну и там MVar было бы проще
Misha
да, между проверкой и writeTVar есть окно, когда другие могут влезть и запустить
Alexander
хотя Value на Promise я загнул
Misha
переход от Empty -> Promise неатомарный
Misha
тут как ни крутись
Alexander
угу
Alexander
тут если использовать то MVar
Alexander
т.к. там IO можно запустить
Misha
надо Mvar попробовать
Misha
да
Misha
по идее Async должен взять на себя все случаю с exceptions и должно получиться без всякой страшной лапши с catch/finally
Alexander
join $ modifyMVar (\case Empty -> do { async »= \x -> return (Promise x, wait x) } ; Promise w -> return (Promise w; wait w); }
Alexander
Value кстати не нужно Async его уже содержит
Misha
о!
Misha
лихо
Misha
буду осмыслять
Misha
спасибо
Alexander
Еще можно unsafePerformIO foo
Alexander
Если NOINLINE сделать
Alexander
Но лучше так не делать
Misha
о нет
Misha
для меня это имеет еще и некоторый педагогический смысл
Misha
поэтому лучше сделать "правильно", а не прогнуть систему под себя
Anatolii
Наверное лучше все что содержит unsafe лучше не делать
Ruslan
Привет всем. Когда-то установил себе haskell-stack, немного поигрался, месяц не трогал, думал начать проект, стал делать, и теперь постоянно выдает такую ошибку в линковщике(здесь про gcc, но у меня такая же с ghc). Может, кто сталкивался?
http://stackoverflow.com/questions/1521859/nonrepresentable-section-on-output-error-during-linking-on-linux
Сделано:
- переустановил stack
- удалил ~/.stack
Alexander
Debian?
Ruslan
Да, sid
Alexander
Используй cabal master
Alexander
Стек не пофиксили еще вроде
Alexander
В дебиане уже слишком новый gcc еще и с -fPIE если не ошибаюсь
Ruslan
Блин, точно. Я ж обновился на полтора гига неделю назад
Ruslan
Спасибо!
Судзумия
В ДЕБИАНЕ СЛИШКОМ НОВЫЙ ГЦЦ
Cinder
Alexander
Он с дурацкими опциями еще собран
Alexander
Ну как для ghc дурацкими
Судзумия
А в арче, наверное, слишком старый gcc 😥
Cinder
> В дебиане уже слишком новый gcc еще и с -fPIE
> с -fPIE
> 2017
ну наконец то хоть в серверном линуксе стали интересоваться безопасностью
Alexander
ну PIE было всегда
Alexander
Alexander
https://ghc.haskell.org/trac/ghc/ticket/12759
Alexander
Там еще пара багов прилинковано
Алдар
http://colah.github.io/posts/2015-09-NN-Types-FP/
Vladislav
Konstantin
http://fpconf.ru/ как так конфа 3 декабря, а я ни слова ни полслова не видел нигде
Anatolii
В гитере гора инфы😉
Konstantin
где?
Anatolii
https://gitter.im/ruHaskell/home
Konstantin
ясно
Нурлан
Сколько там регистрация стоит?
Vladimir
(\
Vladimir
А как можно сделать ленивый лист IO экшонов? Например, у меня есть IO (Maybe String) и таких бесконечный лист. Как бы мне сделать takeWhile isJust от него, чтобы он весь не эвалюэйтился?
Vladimir
sequence, насколько я понял, до конца эвалюэйтит
Misha
http://hackage.haskell.org/package/base-4.9.0.0/docs/System-IO-Unsafe.html#v:unsafeInterleaveIO если я не ошибаюсь
Misha
но это некогерный способ
Misha
некошерный
Vladimir
да, чет не очень кошерно)
Misha
кошерный будет через pipes/conduits
Misha
но тут я уже не спец ни разу
Vladimir
а типа нельзя как-нибудь LiftM сделать этого дела
Vladimir
хитрым способом
Vladimir
наверно проще не выеживаться и написать свою функцию без мапа)
Alexander
loop [] = return []
loop (x:xs) = x >>= \case
Nothing -> return x
Just v -> fmap (v :) (loop xs) -- если строго или do
vs <- unsafeInterleaveIO $ loop xs
return (v:vs)
Misha
возможно, но lazy IO это всегда шаткая тема
Vladimir
вот я щас так примерно и начал делать
Alexander
это если не включая мозг
Vladimir
спасибо
Vladimir
У меня даже попроще получилось вроде
Alexander
щас придумаю как включая мозг, как не все запустить я вижу, а вот как ещё и результат вытащить
Vladimir
getAllEvents locale =
getAllEvents' "" [1..]
where getAllEvents' acc (x:xs) = do
page <- getPage locale x
case page of
Just p -> getAllEvents' (acc ++ p) xs
Nothing -> return acc
Vladimir
где getPage :: String -> Int -> IO (Maybe String)
Vladimir
вроде работает
Alexander
loop (x:xs) = x >>= \case
Nothing -> return x
Just v -> fmap (v :) (loop xs)
имх проще