Ответ 1
System.Directory.getCurrentDirectory
Я начал учить себя Haskell, и для этого я установил Платформа Haskell для Windows. Я использую WinGHCi
на данный момент. Я узнал, что у него есть команда :cd
, которая используется для изменения каталога. Но вопрос в том, как узнать, в какой директории я сейчас? Не зная сначала, зачем мне менять каталог. Я много искал, но не смог найти ответ.
Скажите, пожалуйста, есть ли способ узнать текущий рабочий каталог. Предпочтительно, я хотел бы сам настроить командную строку, чтобы показать текущий каталог, в значительной степени похожий на Linux Console.
Следуя предложению @Daniel, я сделал следующее:
.ghci
(я думаю, что это для Unix-подобной ОС), поэтому я создал файл ghci.conf
в папке C:\Users\Apelles\AppData\Roaming\ghc
, так как он указан здесь.ghci.conf
.ghci.exe
, который является консольным окном. Я заметил, что он загрузил несколько модулей, чем обычно используется для загрузки ранее. Вот снимок:
Как вы можете видеть, он загружает больше модулей, а в последней строке -
Невозможно разобрать строку подсказки. Используйте синтаксис Haskell.
Что это значит? Какая строка вызывает проблему (из следующего script)?
let cur fill = do { cwd <- System.Directory.getCurrentDirectory; return (":set prompt \"" ++ cwd ++ fill ++ " \""); }
:def doprompt (\_ -> cur ">")
:def mycd (\dir -> System.Directory.setCurrentDirectory dir >> cur ">")
:doprompt
Кроме того, если я переименую файл ghci.conf
на какое-то случайное имя, а затем запустив ghci.exe
, он загрузит эти модули:
Как я уже говорил, он загружает меньшее количество модулей, что означает, что с ghci.conf, ghci.exe
делает что-то успешно, но сбой в какой-то момент. Как это исправить?
System.Directory.getCurrentDirectory
Решение для бедных людей, чтобы установить приглашение ghci для текущего рабочего каталога, будет помещать
let cur fill = do { cwd <- System.Directory.getCurrentDirectory; return (":set prompt \"" ++ cwd ++ fill ++ " \""); }
:def doprompt (\_ -> cur ">")
:def mycd (\dir -> System.Directory.setCurrentDirectory dir >> cur ">")
:doprompt
в файле .ghci
.
В первой строке мы определяем cur :: String -> IO String
, который получает текущий каталог и возвращает команду ghci, чтобы соответствующим образом установить запрос. Затем мы определяем команду ghci doprompt
, которая выполняет это действие и команду для изменения каталога и установки приглашения. Последняя строка выполняет :doprompt
при запуске.
К сожалению, это не означает, что :cd dir
отражает изменение каталога, после этого нужно будет вручную выполнить :doprompt
или использовать :mycd
для изменения каталога.
Чтобы избежать слишком длинных запросов, можно было бы обработать результат getCurrentDirectory
, отбросив начальную часть пути к файлу.
Другим недостатком этого простого подхода является то, что в приглашении больше нет информации о загруженных модулях. Я считаю, что все это можно преодолеть, но я недостаточно мотивирован, чтобы сделать рытье сейчас.
Я не уверен, что это "правильный" способ сделать это, но так как :!
позволяет команды оболочки, вы также можете получить его с помощью соответствующей команды оболочки (вашей ОС) для считывания каталога или содержимого (например, cd
, ls
и тому подобное). Например, вы можете написать:
:! cd
Это зависит от того, для чего вам нужен каталог. Если вы просто хотите распечатать его в консоли, это может помочь.
Всего наилучшего!
В командной строке ghci введите :! cd
:! cd
, он даст вам вывод для текущего каталога и использовать :!
затем команды оболочки для запуска любой команды оболочки в командной строке ghci. Оболочки различаются в Windows и Mac/Linux, поэтому команды, которые вы можете использовать, будут разными.