Я пишу функцию, в которой я обрабатываю список, используя forM_
, и добавляю результат в список TVar
:
import Control.Concurrent.STM
import Control.Concurrent.STM.TVar
import Control.Concurrent (forkIO)
import Control.Monad (forM_)
insert :: a -> [a] -> [a]
insert = (:) -- stub
my_func_c :: (a -> a) -> [a] -> IO [a]
my_func_c my_function arr = do
res_var <- atomically $ newTVar ([]::[a])
forkIO $ forM_ arr $ \x -> atomically $ do
let y = id $! my_function x
modifyTVar res_var (insert y)
atomically $ readTVar res_var
Результат всегда пустой, если я скомпилирую его с помощью -threaded
. Как можно дождаться завершения потоков? Я не могу использовать MVar
или Async
. Я должен решить эту проблему, используя TVar
или другие структуры данных, основанные на TVar
.