35

我已经开始自学 Haskell,为此我安装了适用于 Windows的 Haskell 平台。我现在正在使用WinGHCi。我了解到它具有:cd用于更改目录的命令。但问题是,我怎么知道我目前在哪个目录?首先不知道为什么我要更改目录。我搜索了很多,但找不到答案。

请告诉我是否有办法知道当前工作目录。最好我想配置命令提示符本身以显示当前目录,就像 Linux 的控制台一样。


按照@Daniel 的建议,我做了这些:

  • 由于我在 Windows 7 上工作,因此没有.ghci文件(我认为它适用于类 Unix 操作系统),所以我在文件夹中创建了一个文件,ghci.conf如此C:\Users\Apelles\AppData\Roaming\ghc所示
  • 将 Daniel 回答中的脚本复制粘贴到ghci.conf.
  • 然后我开始ghci.exe了类似控制台的窗口。我注意到它加载的模块比以前通常加载的模块多。这是快照:

在此处输入图像描述

如您所见,它加载了更多模块,最后一行说,

无法解析提示字符串。使用 Haskell 语法。

这是什么意思?哪一行导致问题(来自以下脚本)?

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文件重命名为某个随机名称,然后 start ghci.exe,它会加载这些模块: 在此处输入图像描述

正如我之前所说,它加载的模块数量更少,这意味着使用ghci.confghci.exe可以成功执行某些操作,但有时会失败。如何解决?

4

4 回答 4

30

System.Directory.getCurrentDirectorydirectory包中。

于 2014-02-27T16:50:15.750 回答
9

我不确定这是否是“正确”的方法,但由于允许使用 shell 命令,您还可以使用适当的 shell 命令(您的:!操作系统)来读取目录或内容(socdls喜欢)。例如,您可以编写:

:! cd

这取决于您需要该目录的用途。如果您只想在控制台中将其打印出来,那么这会有所帮助。

一切顺利!

于 2018-05-30T16:26:00.010 回答
4

穷人将 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通过删除文件路径的初始部分来操纵结果。

这种简单方法的另一个缺点是提示不再包含有关已加载模块的信息。我相信所有这些都可以克服,但我现在没有足够的动力去挖掘。

于 2012-06-29T13:55:37.763 回答
2

在 ghci 命令提示符类型:! cd中,它将为您提供当前目录的输出。通常,使用:!后跟 shell 命令在 ghci 命令提示符下运行任何 shell 命令。Windows 和 Mac/Linux 上的 shell 不同,因此您可以使用的命令会有所不同。

于 2019-03-14T10:45:43.690 回答