ghci没有从文件加载函数

时间:2010-06-01 13:33:46

标签: haskell ghci

在test.hs中,我有:

doubleMe x = x + x

在ghci中,我输入:

Prelude> :l test
[1 of 1] Compiling Main             ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main> doubleMe 9

<interactive>:1:0: Not in scope: `doubleMe'
*Main> 

为什么呢?怎么解决?

4 个答案:

答案 0 :(得分:29)

我的猜测是你在源文件中定义了一个main函数。

如果您定义了main功能,则使用:l test加载模块将不会导入除main之外的任何功能。在这种情况下,您可以通过在模块名称前添加一个星号来加载它::l *test。 原因是编译后的二进制文件将隐藏非导出的顶级函数。在preterix之前强制GHCi忽略预编译模块(测试)并解释源文件(test.hs)。

[jkramer/sgi5k:.../haskell]# cat test.hs 

main = do
    print $ doubleMe 2

doubleMe x = x + x

[jkramer/sgi5k:.../haskell]# ghc --make test
[jkramer/sgi5k:.../haskell]# ghci
[...some messages...]
>> :l test
Ok, modules loaded: Main.
>> :t doubleMe

<interactive>:1:0: Not in scope: `doubleMe'
>> :l *test
[1 of 1] Compiling Main             ( test.hs, interpreted )
Ok, modules loaded: Main.
>> :t doubleMe
doubleMe :: (Num a) => a -> a

请查看以下链接以获取更多信息:

http://www.haskell.org/ghc/docs/6.12.2/html/users_guide/ghci-compiled.html    http://www.haskell.org/ghc/docs/6.12.2/html/users_guide/interactive-evaluation.html#ghci-scope

答案 1 :(得分:5)

  1. 从目录中删除test.hi和test.o,然后尝试ghci test。 [有时当我运行ghc file.hs(而不是ghc --make file.hs)时,它会给出未定义的引用错误,但会创建稍后由ghci读取的文件。也许这是一个错误。]

  2. 尝试

    :cd "<path to your file>"
    :l test
    :browse
    

    在ghci。结果是什么?

答案 2 :(得分:4)

您确定要加载正确的test.hs吗?也许你在错误的目录中。或者,在添加doubleMe的定义后,您可能没有保存test.h。

答案 3 :(得分:0)

这也发生在我身上 - 如果有其他人遇到它并偶然发现这个页面,我的问题是我运行GHCI的VM没有磁盘空间 - 提示它尝试加载一个空文件每一次。