Home > front end >  Let binding in Haskell
Let binding in Haskell

Time:12-29

I want to print the following output.

import Data.Char  
  
main = do  
    output = map toUpper "helloworld"
    putStrLn output 

It failed with the error message.

test.hs:4:12: error:
    parse error on input ‘=’
    Suggested fix:
      Perhaps you need a 'let' in a 'do' block?
      e.g. 'let x = 5' instead of 'x = 5'
  |
4 |     output = map toUpper "helloworld"  
  | 

However, if I use let binding, it works. Why?

main = do  
    -- it works
    let output = map toUpper "helloworld"
    putStrLn output 

CodePudding user response:

Inside do, the syntax does require one to use let variable = expression, as the error message suggests. There's not much to say about that syntactical choice.

One might wonder why variable = expression (without let) was not chosen as the correct syntax. It's hard to guess the rationale, but note that

foo = do
   let x1 = e1
   let x2 = e2
   ...

and

foo = do
   let x1 = e1
       x2 = e2
   ...

are both valid. The main difference is that the latter allows both e1 and e2 to refer to both x1 and x2, which is useful for mutually recursive definitions. By contrast, in the former do block e1 can not refer to x2.

The point is that after a let one can write a block of defining equations, and not just a single one.

Anyway, the difference explained above is not that important in practice since we do not use mutual recursion that often. Still, it is there.

  • Related