#macos #haskell #load #ghci
#macos #haskell #загрузка #ghci
Вопрос:
Я совершенно новичок в Haskell. Чтобы понять основы, я начал работать с «Изучите Haskell для большего блага». Я застрял на простом вопросе загрузки функции из файла.
Файл вызывается baby.hs
и содержит функцию
doubleMe x = x x
и больше ничего. Я сохранил его /Users/me
.
Набрав :load baby
в GHCi, я получаю следующую ошибку:
целевой `дочерний элемент» не является именем модуля или исходным файлом.
Я работаю на компьютере Mac и создал свой baby.hs
файл, используя набор TextEdit для создания обычного текстового / UTF-8 файла. Я думаю, что мой домашний каталог /Users/me
, хотя я не уверен, как проверить это из GHCi, это происходит, когда я проверяю из bash перед запуском GHCi.
Есть идеи, что я делаю не так?
Ответ №1:
Как предлагает @clintm, сначала исправьте вашу функцию doubleMe. То, что у вас есть, приведет к ошибкам, но не к тем ошибкам, о которых вы сообщаете.
Самый простой способ заставить ghci найти ваш файл — убедиться, что вы запускаете ghci из того же каталога, в котором сохранен ваш файл. Откройте окно терминала и введите
cd /Users/me
ls
ls
выводит содержимое текущего каталога; вы должны увидеть свой файл. Если вы это сделаете, отлично! Введите ghci
в командной строке bash и :load baby
должно сработать. Если нет, то вы не сохранили свой файл там, где, по вашему мнению, у вас есть. Вернитесь к TextEdit или используйте Spotlight, чтобы увидеть, куда вы действительно ее поместили.
Комментарии:
1. спасибо, ввод ls показал проблему: мой файл действительно вызывался baby.hs.txt ! Кажется, что TextEdit добавляет суффикс .txt, даже если вы перезаписываете расширение на .hs, а Finder не отображает .txt, а только .hs . Похоже, он отображает .txt для обычных файлов TextEdit, поэтому я предполагаю, что он делает что-то вроде отображения первого .suffix и скрывает все остальные.
2. @Alec: Ой. Найдите лучший редактор. Даже если вы не хотите тратить время на изучение одной из классических рабочих лошадок (vim или emacs), для OSX есть множество хороших текстовых редакторов. Подсветка синтаксиса является обязательной.
Ответ №2:
Вам не хватает строки модуля. Первая строка файла baby.hs должна быть
module Baby where
Что касается, doubleMe
вам не хватает объявления x
в качестве аргумента функции.
doubleMe x = x x
В противном случае ваша функция не знает, что x
это такое.
Комментарии:
1. Строка модуля — хорошая практика, но в этом простом случае это не обязательно. Он должен работать без этого.
2. извиняюсь, ошибка doubleMe была опечаткой в вопросе. Проблема заключалась в том, что файл действительно вызывался baby.hs.txt но я не заметил этого, поскольку Finder по какой-то причине скрывает часть .txt.
Ответ №3:
Попробуйте использовать полный путь, например:
:load /Users/me/baby.hs
Вы также должны иметь возможность использовать относительные пути. Попробуйте перейти к каталогу, который baby.hs
находится в первом:
% cd /Users/me
% ghci
GHCi blah blah blah
Prelude> :load baby.hs
Когда вы получите эту работу, попробуйте оставить .hs
. Я не уверен на 100%, при каких обстоятельствах это работает.
Комментарии:
1. Вы можете указать
:load
имя файла (всегда включая завершающее.hs
или.lhs
) или имя модуля (которое должно начинаться с заглавной буквы).2. @dave4420: вы можете опустить конечную
.hs
строку в именах файлов. GHCi достаточно умен, чтобы попробовать несколько вариантов.3. Спасибо. В конце концов, я обнаружил проблему, мой файл действительно был вызван baby.hs.txt , хотя Finder скрывает файл .txt
Ответ №4:
@Alec: «Проблема заключалась в том, что файл действительно вызывался baby.hs.txt но я не заметил, что по какой-то причине Finder скрывает часть .txt «.
Вы можете обойти это в TextEdit…
-
выберите свой baby.hs.txt файл
-
коснитесь его двумя пальцами, чтобы открыть контекстное меню
-
выберите Получить информацию, чтобы открыть диалоговое окно информации о файле
-
введите baby.hs в область имени и расширения
-
закройте диалоговое окно с информацией
-
в другом диалоговом окне спрашивается, действительно ли вам нужно расширение .hs
-
подтвердите, что вы это делаете, и все готово
Ответ №5:
Попробуйте открыть текстовый файл с помощью GHCi, затем введите свою команду, и это сработает