我想打印以下输出。
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
1条答案
按热度按时间t0ybt7op1#
在
do
内部,语法确实要求使用let variable = expression
,正如错误消息所暗示的那样,关于语法选择没有太多要说的。有人可能会问,为什么没有选择
variable = expression
(没有let
)作为正确的语法,很难猜测其基本原理,但请注意以及
是 both valid。主要区别在于后者允许
e1
和e2
都引用x1
和x2
,这对于相互递归定义很有用。相比之下,在前者中,块e1
不能引用x2
。关键在于,在
let
之后,可以写出一个定义方程块,而不仅仅是一个。无论如何,上面解释的区别在实践中并不重要,因为我们并不经常使用相互递归。