Я пишу программу, которая подсчитывает частоты NGrams в корпусе. У меня уже есть функция, которая потребляет поток токенов и производит NGram одного порядка:
ngram :: Monad m => Int -> Conduit t m [t]
trigrams = ngram 3
countFreq :: (Ord t, Monad m) => Consumer [t] m (Map [t] Int)
На данный момент я просто могу подключить одного потребителя потока к источнику потока:
tokens --- trigrams --- countFreq
Как подключить несколько потребителей потока к одному и тому же источнику потока? Я хотел бы иметь что-то вроде этого:
.--- unigrams --- countFreq
|--- bigrams --- countFreq
tokens ----|--- trigrams --- countFreq
'--- ... --- countFreq
Плюсом будет параллельный запуск каждого потребителя
EDIT: благодаря Петру я придумал это решение
spawnMultiple orders = do
chan <- atomically newBroadcastTMChan
results <- forM orders $ \_ -> newEmptyMVar
threads <- forM (zip results orders) $
forkIO . uncurry (sink chan)
forkIO . runResourceT $ sourceFile "test.txt"
$$ javascriptTokenizer
=$ sinkTMChan chan
forM results readMVar
where
sink chan result n = do
chan' <- atomically $ dupTMChan chan
freqs <- runResourceT $ sourceTMChan chan'
$$ ngram n
=$ frequencies
putMVar result freqs
tokens
давал значение, все ваши...grams
получали его? - person Petr   schedule 29.07.2013