Я хочу получить строку, преобразовать ее в список и написать каждый элемент списка в TChan. Для каждой полученной строки я хочу разблокировать новый процесс.split IO и вычисление
Моя проблема заключается в том, что я получаю ошибки, связанные с IO, когда я пытаюсь скомпилировать это:
Couldn't match expected type `IO()' with actual type `[()]'
или
Couldn't match expected type `IO()' with actual type `[IO()]'
Хотя я полностью понимаю ошибку и знать, где оно происходит от (- по крайней мере, первая ошибка). Теперь я не понимаю, как я мог бы разбить IO на вычисление в моем примере и все еще добиваться того, что я пытаюсь сделать.
write2TChan msg mtch = do
let mymessages = words msg
map (\x -> atomically $ writeTChan mtch x) mymessages
return()
main = withSocketsDo $ do
s <- socket AF_INET Datagram defaultProtocol
bindAddr <- inet_addr host
bindSocket s (SockAddrInet port bindAddr)
mtch <- newTChanIO
let forever socket hosts = do
(msg, host) <- receiveMessage socket
return()
return (forkIO $ write2TChan msg mtch)
--forkIO $ write2TChan msg mtch
--tried w return() and above, same problem
forever socket hosts
forever s []
sClose s
Немного не по теме: будет ли иметь большое значение использование парного комбинатора вместо forkIO? Я обеспокоен тем, что в моем примере количество потоков не ограничено, конечно. –
@JFritsch: 'par' предназначен для параллелизма в чистом коде. Здесь вы делаете параллелизм с множеством побочных эффектов, а не с параллелизмом, поэтому 'par' даже не вариант для начала. Кроме того, помните, что 'forkIO' порождает легкие потоки Haskell, поэтому, если вы не размножаете тысячи из них, я бы не стал слишком беспокоиться об этом. – hammar