为什么不能在do块中使用替换? 这段代码工作正常。
test :: (x -> x) -> [x] -> [x]
test f a = map f a
main :: IO ()
main = do
let sq x = x * x :: Int
let ret = test sq [1,2,3]
print ret
但是如果删除do块中的let,我就会遇到编译错误。
parse error on input ‘=’
Perhaps you need a 'let' in a 'do' block?
e.g. 'let x = 5' instead of 'x = 5'
在do块中“let x = y”等于“x< - y”吗? 因此,如果右侧返回IO某事,您需要使用let(或&lt ;-)? 我知道这是一个虚拟问题,但我总是遇到编译错误。 EII
答案 0 :(得分:5)
let
是您为do
块内的名称指定值的方式。 let x = y
不等同于x <- y
。在do
区块内,let
像这样去了解。
do let x = y
...
变为
let x = y
in do ...
,而
do x <- y
...
变为
do y >>= (\x -> ...)
Bare =
仅用于顶级赋值,用于定义函数和常量(与0参数函数非常相似)。