ghci не загружает функцию из файла - PullRequest
6 голосов
/ 01 июня 2010

В 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 ]

29 голосов
/ 02 июня 2010

Я предполагаю, что вы определили главную функцию в вашем исходном файле.

Если вы определили функцию main, загрузка модуля с :l test не будет импортировать какие-либо функции, кроме main. В этом случае вы можете загрузить его, добавив звездочку к имени модуля: :l *test. Причина в том, что скомпилированный двоичный файл будет скрывать неэкспортированные функции верхнего уровня. Добавление звездочки заставляет GHCi игнорировать предварительно скомпилированный модуль (test) и вместо этого интерпретировать исходный файл (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

5 голосов
/ 01 июня 2010
  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. Каков результат?

4 голосов
/ 01 июня 2010

Вы уверены, что загружаете правильный test.hs? Может быть, вы не в том каталоге. Или, может быть, вы не сохранили test.hs после добавления определения doubleMe.

0 голосов
/ 26 января 2013

Это тоже случилось со мной - и в случае, если кто-то столкнется с ним и наткнется на эту страницу, моя проблема заключалась в том, что на виртуальной машине, на которой я запускал GHCI, не хватило места на диске - что заставило ее попытаться загрузить пустой файл каждый раз.

...