2012-04-16 56 views
3

绑定变量的作用域是什么?为什么我无法从where子句中访问它? 例如,在这个例子中:Haskell:where子句中的绑定变量

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

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

回答

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条款的范围,他们不能在该条款中的任何定义中使用的:脱糖上面的代码时,这变得清晰。

+0

谢谢。这解释了它。 – 2012-04-16 02:50:51