【发布时间】:2020-07-31 09:04:02
【问题描述】:
我正在尝试使用where 在do 块中定义的操作中使用外部范围中定义的变量:
module Main where
main :: IO ()
main = do
outerVar <- return "a"
doSomething
where
doSomething :: IO String
doSomething = putStrLn ("outerVar: " ++ outerVar)
鉴于这个 sn-p,我试图理解为什么编译器会返回以下错误:
error: Variable not in scope: outerVar :: [Char]
|
9 | doSomething = putStrLn ("outerVar: " ++ outerVar)
|
根据我的理解 - doSomething 函数应该创建某种“闭包”来包含 outerVar 的值(我刚刚发现它被称为 free variable),但这并不发生。
我花了很多时间试图弄清楚为什么会发生这个错误。我很尴尬,即使对于作为 Haskell 新手的我来说,这似乎是一个应该很明显的基本概念,但事实并非如此——希望我错了。搜索“在哪里做块范围”、“在哪里关闭”或类似关键字时,我找不到任何答案。比较let 和where 的This page 没有提到我的情况,我发现的最接近的例子是here 的第一段代码,其中涵盖了“Lambda 提升”主题。他们能够在where 中定义的函数内使用外部作用域的n 变量,但它不像我的情况那样在do 块中。
所以我的问题是 - 为什么 outerVar 变量不在 doSomething 的范围内?
【问题讨论】:
-
是的,这完全是同一个问题。谢谢!我不知道为什么我之前找不到这个问题...
-
(我重新打开了这个问题,然后立即意识到没有必要这样做。对不起,不必要的 ping!)
标签: haskell scope where-clause do-notation