3

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

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

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

4

1 回答 1

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,并且它们不能在该子句的任何定义中使用。

于 2012-04-16T02:29:18.213 回答