为什么在使用let(绑定)时不能在do块中使用替换?

eii*_*000 0 haskell

为什么不能在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
Run Code Online (Sandbox Code Playgroud)

但是如果你删除do块中的let,我就会遇到编译错误.

parse error on input ‘=’
Perhaps you need a 'let' in a 'do' block?
e.g. 'let x = 5' instead of 'x = 5'
Run Code Online (Sandbox Code Playgroud)

在do块中"let x = y"等于"x < - y"吗?因此,如果右侧返回IO某事,您需要使用let(或< - )?我知道这是一个虚拟问题,但我总是遇到编译错误.EII

che*_*ner 5

let是如何为do块内的名称赋值.let x = y不等于x <- y.在一个dolet区内,像这样的desugars.

do let x = y
   ...
Run Code Online (Sandbox Code Playgroud)

let x = y
in do ...
Run Code Online (Sandbox Code Playgroud)

do x <- y
   ...
Run Code Online (Sandbox Code Playgroud)

do y >>= (\x -> ...)
Run Code Online (Sandbox Code Playgroud)

Bare =仅用于顶级赋值,用于定义函数和常量(与0参数函数非常相似).