Haskell:where子句中的绑定变量

时间:2012-04-16 01:51:15

标签: haskell

绑定变量的范围是什么?为什么我不能从where子句中访问它? 例如,在此示例中:

someFunc x y = do
  let a = x + 10
  b <- someAction y
  return subFunc
  where
    subFunc = (a * 2) + (b * 3)

这里,subFunc可以看到但不是b。 为什么我不能在where子句中使用绑定变量?谢谢。

1 个答案:

答案 0 :(得分:8)

因为它可能导致不一致。想象一下这段代码:

printName = do
  print fullName
  firstName <- getLine
  lastName <- getLine
  return ()
  where
    fullName = firstName ++ " " + lastName

此代码不起作用,并且由于这些情况,绑定变量的使用仅限于实际绑定之后的do块的部分。在贬低上述代码时,这一点就变得清晰了:

printName =
  print fullName >>
  getLine >>= (\ firstName ->
    getLine >>= (\ lastName ->
      return ()
    )
  )
  where
    fullName = firstName ++ " " ++ lastName

在这里,可以看到变量firstNamelastName不在where子句的范围内,并且它们不能在该子句中的任何定义中使用。