[Haskell-cafe] try, seq, and IO
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:
| 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