2012-04-16 57 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