在这种情况下,为什么会收到不在范围内的错误变量?

时间:2020-08-06 19:50:04

标签: haskell

当我使用以下代码创建.hs文件并使用:l将其加载到ghci时,文件会加载,但是如果我询问{{1 }}。我知道这意味着我使用的名称未在尝试使用的位置中定义,但是我看不到代码有什么问题:

<interactive>:1:1: error: Variable not in scope: symbol

4 个答案:

答案 0 :(得分:1)

在ghci中键入多行内容时(例如类型声明,类定义,另一行上的deriving子句),您必须进入多行模式。您可以输入:{,这会将您置于多行提示符下,然后输入您的代码,然后在另一行上输入:}以退出多行提示符。然后,它将把您的代码解释为一个块而不是很多行。

答案 1 :(得分:1)

我想问题是您的模块以这种方式启动:

module MyData
    (MetricUnit(..),
     ImperialUnit(..),
     Measurement(..),
     convert)
where

因此,模块未导出函数symbol

在GHCi中,从命令行以ghci MyData.hs加载模块,或从GHCi提示符以:load MyData加载模块应绕过导出列表,并允许您访问所有内容。

您还可以将symbol添加到导出列表中。

您收到该错误,是因为(我想)您正在使用另一种方式来导入模块,该方式将不允许您访问未导出的标识符。也许您正在通过另一个模块导入该模块?

答案 2 :(得分:0)

我将从“无法复制”开始:

% cat <<EOF > ap.hs
heredoc> data MetricUnit = Meter | Liter | KiloGram
       deriving (Show, Eq)

symbol :: MetricUnit -> String
symbol Meter = "m"
symbol Liter = "L"
symbol KiloGram = "kg"
heredoc> EOF
tommd@ovdak /tmp% ghci ap.hs
GHCi, version 8.6.4: http://www.haskell.org/ghc/  :? for help
Loaded package environment from /Users/tommd/.ghc/x86_64-darwin-8.6.4/environments/default
package flags have changed, resetting and loading new packages...
Loaded GHCi configuration from /Users/tommd/.ghci
[1 of 1] Compiling Main             ( ap.hs, interpreted )
Ok, one module loaded.
*Main>

所以它加载正常。

也许您正在尝试定义 GHCi中的代码,而不是从文件中加载它?在这种情况下,请参阅@ Aplet123关于多行的答案。有关您可能正在使用的GHCi破损的示例,请考虑:

*Main> foo :: Bool

<interactive>:1:1: error: Variable not in scope: foo :: Bool
*Main> foo = True

输入第一行后,GHCi会尝试向您显示foo(print (foo :: Bool))而没有foo,它将告诉您foo不在范围内。再次,请参见其他答案。

答案 3 :(得分:0)

问题是由于存在另一个同名文件导致的。

当我使用新的文件名创建新文件时,该问题已解决。