[Haskell-beginners] Hints on how to remove unsafePerformIO from my function?

aditya siram aditya.siram at gmail.com
Mon Jul 19 13:50:34 EDT 2010


Have you looked at the Real World Haskell example [1] for reading from
a UDP socket?  In the inner "procMessages" the authors seem to show
how to read one packet at a time without using unsafePerformIO.

-deech

[1] http://book.realworldhaskell.org/read/sockets-and-syslog.html in
the section marked "UDP Syslog Server"


On Mon, Jul 19, 2010 at 9:07 AM, David McBride <dmcbride at neondsl.com> wrote:
> I am writing a voip server to take advantage of haskells awesome threading
> and parsing ability.  At first everything was going great, but my thread
> that fetches udp makes use of unsafePerformIO:
>
> fetchUDPSIP :: TChan B.ByteString -> IO ()
> fetchUDPSIP chan = do
>   sock <- getUDPSocket 5060
>   let results = (unstrict . repeat . getUDP) sock
>   mapM_ (atomically . writeTChan chan) results
>   where
>     unstrict [] = []
>     unstrict (x:xs) = unsafePerformIO x:unstrict xs
>
>
> It fetches it from a socket, and then writes it to a TChan.  This results in
> a stream of bytestrings that another thread can read from.  If I don't use
> unsafePerformIO, then it tries to read all possible packets before returning
> anything, and so it never writes to the TChan at all.  The problem with
> doing it this way is that unsafePerformIO apparently stops every other
> thread from doing anything while it is waiting for a packet.
>
> But I can't think of a way to rewrite this function to do what I want.  I'm
> kind of new to this, does anyone have any hints that could help me out?
>
> Here's a simple version without any of the implementation details:
>
> fetchLine = do
>   let results = (unstrict . repeat) getLine
>   mapM_ putStrLn results
>   where
>     unstrict [] = []
>     unstrict (x:xs) = unsafePerformIO x:unstrict xs
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>


More information about the Beginners mailing list