Haskell ghci未从文件加载函数

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

在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]编译Main(test.hs,解释)
好的,模块已加载:Main。
*Main>doubleMe 9
:1:0:不在范围内:`doubleMe'
*Main>

为什么??如何修复?

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

  • 从目录中删除test.hi和test.o,然后尝试
    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