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

时间:2016-10-07 12:47:44

标签: 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

但是如果删除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

1 个答案:

答案 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参数函数非常相似)。