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、実際のバインドに続くブロックの部分に制限されます。これは、上記のコードを desugar すると明らかになります。

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

ここで、変数firstNamelastNameが節の範囲内になく、whereその節のどの定義でも使用できないことがわかります。

于 2012-04-16T02:29:18.213 に答える