[Haskell-cafe] try, seq, and IO

Simon Peyton-Jones simonpj at microsoft.com
Wed Sep 15 12:38:25 EDT 2010

You may get useful help from Haskell Cafe.  But if you can produce a cut-down example without complex dependencies, we could also look at it.


| -----Original Message-----
| From: haskell-cafe-bounces at haskell.org [mailto:haskell-cafe-
| bounces at haskell.org] On Behalf Of Jeroen van Maanen
| Sent: 15 September 2010 10:13
| To: Haskell Café
| Subject: [Haskell-cafe] try, seq, and IO
| The past year I have been working on a port of my machine learning project
| named LExAu from Java to Haskell. I'm still very glad I took the jump,
| because the complexity curve appears to be log shaped rather than exp shaped.
| In one year I almost got to the functionality that had taken me five years to
| produce in Java (of course it helped a lot that I had a working prototype
| this time).
| There is one thing that still bothers me though: when I write seq or $! it
| doesn't seem to have any effect!
| Currently I am trying to add some exception handling to help me debug the
| system, but the code that I managed to produce depends on the logging
| statement to produce the desired result. :-( It looks like this, and only
| works when I uncomment the line '-- logger "Check sum": [...]', otherwise the
| exception is caught by the try around the body of the thread that this code
| runs in:
|          do logger "Received update" [showString label, logs update]
|             result <-
|               try $!
|                 do maybeUpdatedModel <- return $ f update startModel
|                    theCheckSum <- return $ liftM checkSum maybeUpdatedModel
| --                   logger "Check sum" [showString label, shows theCheckSum]
|                    return $! seq theCheckSum maybeUpdatedModel
|             maybeNextModel <-
|               case result of
|                 Right theMaybeNextModel -> return theMaybeNextModel
|                 Left exception ->
|                   do let exc :: SomeException
|                          exc = exception
|                      logger "Exception" [showString label, shows exception]
|                      return Nothing
|             logger "Maybe next model" [showString label, logs maybeNextModel]
| For more context see:
| http://lexau.svn.sourceforge.net/viewvc/lexau/branches/totem/src/LExAu/Pipeli
| ne/Concurrent.hs?revision=326&view=markup
| after line 241.
| Can someone explain why a few showStrings a shows and a putStrLn are more
| effective in forcing the check sum to be computed (which necessarily
| evaluates the complete updated model and reveals the lurking exception) than
| the seq on the line just below the logging statement?
| Cheers,  Jeroen

More information about the Haskell-Cafe mailing list