[Haskell-beginners] Precedence of Infix Operators in Do Syntax

Alexander Bernauer alex-haskell at copton.net
Wed Nov 23 11:15:59 CET 2011


Hi

On Tue, Nov 22, 2011 at 11:03:51PM -0500, Avery Robinson wrote:
> main = do
>   m <- hGetContents stdin
>   nums <- mapM readM . lines $ m
>   print (sum nums)
>   `catch` (\e -> hPutStrLn stderr ("couldn't sum lines: " ++ show e))

Using Hammar's naive do-notation desugarer [1] your example code
becomes:
---8<---
main
  = hGetContents stdin >>=
      \ m -> mapM readM . lines $ m >>= \ nums -> print (sum nums)
      `catch`
      (\ e -> hPutStrLn stderr ("couldn't sum lines: " ++ show e))
--->8---

Comparing this with "ghc -ddump-ds" (cleaned up by removing _xyz
suffixes and type annotations)
---8<---
Main.main =
  System.IO.Error.catch
    (>>=
       (GHC.IO.Handle.Text.hGetContents GHC.IO.Handle.FD.stdin)
       (\ m ->
          >>=
            (GHC.Base.$
               (GHC.Base..
                  (mapM readM)
                  Data.List.lines)
               m)
            (\ nums ->
               print_aAV (sum_aAU nums))))
    (\ e ->
       System.IO.hPutStrLn
         GHC.IO.Handle.FD.stderr
         (GHC.Base.++
            (GHC.Base.unpackCString# "couldn't sum lines: ")
            (show e)))
--->8---
confirms this. But why is that?

The section on do expressions of the Haskell report [2] explains that in
the end a do block is just an expression.

And section 3.4 [3] states that "e1 op e2 = (op) e1 e2", which in our
case translates to "e1 `catch` e2 = catch e1 e2" where e1 is the
preceeding do block and e2 is the lambda expression.

So, the line starting with `catch` is not part of the do block any more.

Greetings

Alex

[1] https://gist.github.com/1341505
[2] http://www.haskell.org/onlinereport/exps.html#sect3.14
[3] http://www.haskell.org/onlinereport/exps.html#sect3.4
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://www.haskell.org/pipermail/beginners/attachments/20111123/986a8a20/attachment.pgp>


More information about the Beginners mailing list