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

は、1変数firstNamelastNamewhere句の範囲に含まれていないことがわかり、そして、彼らはその句のいずれかの定義で使用することができないことができます:上記のコードを脱糖とき、これが明確になります。

+0

ありがとうございます。それはそれを説明する。 –

関連する問題