Ошибка загрузки функции из файла в GHCI

Я совершенно новичок в Haskell. Чтобы понять основы, я начал работать с «Изучай Haskell во благо». Я застрял на простом вопросе загрузки функции из файла.

Файл называется baby.hs и содержит функцию

doubleMe x = x + x

и ничего больше. Я сохранил его в /Users/me.

Набрав :load baby в GHCi, я получаю следующую ошибку:

target `baby' не является именем модуля или исходным файлом.

Я работаю на Mac и создал свой файл baby.hs с помощью набора TextEdit для создания файла с простым текстом/UTF-8. Я думаю, что мой домашний каталог /Users/me, хотя я не уверен, как это проверить из GHCi, это когда я проверяю из bash перед запуском GHCi.

Любая идея, что я делаю неправильно?


person Alec    schedule 11.10.2011    source источник


Ответы (5)


Как предлагает @clintm, сначала исправьте свою функцию doubleMe. То, что у вас есть, будет давать ошибки --- но не ошибки, о которых вы сообщаете.

Самый простой способ заставить ghci найти ваш файл — убедиться, что вы запускаете ghci из того же каталога, в котором сохранен ваш файл. Откройте окно терминала и введите

cd /Users/me
ls

ls перечисляет содержимое текущего каталога; вы должны увидеть свой файл. Если вы это сделаете, отлично! Введите ghci в командной строке bash, и :load baby должно сработать. Если нет, вы не сохранили свой файл там, где, как вы думаете, у вас есть. Вернитесь в TextEdit или используйте Spotlight, чтобы увидеть, куда вы действительно его поместили.

person Zopa    schedule 12.10.2011
comment
спасибо, ввод ls показал проблему: мой файл действительно назывался baby.hs.txt! TextEdit, похоже, добавляет суффикс .txt, даже если вы перезаписываете расширение с помощью .hs, а Finder не отображает .txt, а только .hs. Кажется, он отображает .txt для обычных файлов textEdit, поэтому я предполагаю, что он делает что-то вроде отображения первого .suffix и скрытия любых других. - person Alec; 12.10.2011
comment
@Алек: Ой. Найдите лучшего редактора. Даже если вы не хотите тратить время на изучение одной из классических рабочих лошадок (vim или emacs), для OSX существует множество хороших текстовых редакторов. Подсветка синтаксиса обязательна. - person rampion; 12.10.2011

Вам не хватает строки модуля. Первая строка baby.hs должна быть

module Baby where

Что касается doubleMe, вам не хватает объявления x в качестве аргумента функции.

doubleMe x = x + x

В противном случае ваша функция не знает, что такое x.

person clintm    schedule 12.10.2011
comment
Строка модуля — это хорошая практика, но в этом простом случае она не нужна. Без него должно работать. - person Zopa; 12.10.2011
comment
извините, ошибка doubleMe была опечаткой в ​​вопросе. Проблема заключалась в том, что файл действительно назывался baby.hs.txt, но я этого не заметил, так как Finder по какой-то причине скрывает часть .txt. - person Alec; 12.10.2011

Попробуйте использовать полный путь, например:

:load /Users/me/baby.hs

Вы также должны иметь возможность использовать относительные пути. Попробуйте сначала перейти в каталог, в котором находится baby.hs:

% cd /Users/me
% ghci
GHCi blah blah blah
Prelude> :load baby.hs

Когда у вас это заработает, попробуйте оставить .hs. Я не уверен на 100%, при каких обстоятельствах это работает.

person Daniel Wagner    schedule 12.10.2011
comment
Вы можете указать :load имя файла (всегда включая конечные .hs или .lhs) или имя модуля (которое должно начинаться с заглавной буквы). - person dave4420; 12.10.2011
comment
@ dave4420: Вы можете опустить .hs в конце имен файлов. GHCI достаточно умен, чтобы попробовать несколько вариантов. - person Zopa; 12.10.2011
comment
Благодарю. Нашел проблему в итоге, мой файл действительно назывался baby.hs.txt, хотя Finder скрывает .txt - person Alec; 12.10.2011

@Alec: «Проблема заключалась в том, что файл действительно назывался baby.hs.txt, но я этого не заметил, поскольку Finder по какой-то причине скрывает часть .txt».

Вы можете обойти это в TextEdit...

  • выберите файл baby.hs.txt

  • коснитесь его двумя пальцами, чтобы открыть контекстное меню

  • выберите «Получить информацию», чтобы открыть диалоговое окно «Информация о файле».

  • введите baby.hs в области «Имя и расширение»

  • закрыть диалоговое окно информации

  • другой диалог спрашивает, действительно ли вам нужно расширение .hs

  • подтвердите, что вы делаете, и вы готовы к работе

person Nick Staresinic    schedule 21.04.2013

Попробуйте открыть текстовый файл с помощью GHCi, затем введите команду, и она сработает.

person deepcovergecko    schedule 06.03.2019