当我使用以下代码创建.hs文件并使用:l
将其加载到ghci时,文件会加载,但是如果我询问{{1 }}。我知道这意味着我使用的名称未在尝试使用的位置中定义,但是我看不到代码有什么问题:
<interactive>:1:1: error: Variable not in scope: symbol
答案 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)
问题是由于存在另一个同名文件导致的。
当我使用新的文件名创建新文件时,该问题已解决。