Haskell ghci未从文件加载函数
在test.hs中,我有:Haskell ghci未从文件加载函数,haskell,ghci,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> 前奏曲>:l测试 [1/1
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>
前奏曲>:l测试
[1/1]编译Main(test.hs,解释)
好的,模块已加载:Main。
*Main>doubleMe 9
:1:0:不在范围内:`doubleMe'
*Main>
为什么??如何修复?您确定加载了正确的test.hs吗?也许你在错误的目录里。或者在添加doubleMe的定义后,您没有保存test.hs
ghci test
。[有时当我运行ghc file.hs
(而不是ghc--make file.hs
)时,它会给出未定义的引用错误,但会创建这样的文件供ghci
以后读取。这可能是一个错误。]:cd "<path to your file>"
:l test
:browse
:cd“”
:l测试
:浏览
在ghci。结果如何我猜您已经在源文件中定义了一个main函数 如果定义了
main
函数,则使用:l test
加载模块将不会导入任何函数,而是导入main
。在这种情况下,您可以通过在模块名称前面加一个星号来加载它::l*test
。
原因是编译后的二进制文件将隐藏未导出的顶级函数。在asterix前面加上前缀将强制GHCi忽略预编译模块(test),并解释源文件(test.hs)
[jkramer/sgi5k:…/haskell]#cat test.hs
main=do
打印$doubleMe 2
doubleMe x=x+x
[jkramer/sgi5k:…/haskell]#ghc——进行测试
[jkramer/sgi5k:…/haskell]#ghci
[…一些消息…]
>>:l测试
好的,模块已加载:Main。
>>:t double我
:1:0:不在范围内:`doubleMe'
>>:l*测试
[1/1]编译Main(test.hs,解释)
好的,模块已加载:Main。
>>:t double我
doubleMe::(数值a)=>a->a
有关更多信息,请查看以下链接:
这也发生在我身上-如果其他人碰到它并无意中看到此页面,我的问题是我运行GHCI的VM磁盘空间不足-每次都会提示它尝试加载一个空文件。我在桌面上创建了一个文件夹,而不是文件夹的快捷方式。这不是op的问题,但是你解决了我的问题。谢谢你的模块名技巧。这对我不起作用。首先,在加载测试之后,提示符将类似于*Main>,而不是>>。我还收到一条错误消息,告诉我:找不到模块“*fadetoblack”:使用-v查看搜索的文件列表。在OS X 10.11.6和GHCI 8.2.2上,您不必在
处使用双引号。您可以试试:cd
。
[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