Haskell中的字母绑定

nvbavucw  于 2022-12-29  发布在  其他
关注(0)|答案(1)|浏览(135)

我想打印以下输出。

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

失败并显示错误消息。

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"  
  |

但是,如果我使用let绑定,它就起作用了,为什么?

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

t0ybt7op1#

do内部,语法确实要求使用let variable = expression,正如错误消息所暗示的那样,关于语法选择没有太多要说的。
有人可能会问,为什么没有选择variable = expression(没有let)作为正确的语法,很难猜测其基本原理,但请注意

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

以及

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

both valid。主要区别在于后者允许e1e2都引用x1x2,这对于相互递归定义很有用。相比之下,在前者中,块e1不能引用x2
关键在于,在let之后,可以写出一个定义方程块,而不仅仅是一个。
无论如何,上面解释的区别在实践中并不重要,因为我们并不经常使用相互递归。

相关问题