获取Haskell中当前源文件的绝对路径
是否可以在Haskell中获取当前源文件的绝对路径 我只能找到一个相关函数:from获取Haskell中当前源文件的绝对路径,haskell,Haskell,是否可以在Haskell中获取当前源文件的绝对路径 我只能找到一个相关函数:fromSystem.Directory,但它“返回调用进程当前目录的绝对路径”,而不是当前文件的路径 (我需要它来读取与源文件位于同一文件夹中的示例输入;如果有更好的方法,那也会很有帮助!)可能会有用。根据描述,它为当前文件名等提供了类似C的字符串 更新 pseudoAcros返回的文件名等于传递给ghc的路径(与@JoachimBreitner在回答中提到的行为相同),因此 将打印 Hello from tmp.hs
System.Directory
,但它“返回调用进程当前目录的绝对路径”,而不是当前文件的路径
(我需要它来读取与源文件位于同一文件夹中的示例输入;如果有更好的方法,那也会很有帮助!)可能会有用。根据描述,它为当前文件名等提供了类似C的字符串
更新
pseudoAcros返回的文件名等于传递给ghc的路径(与@JoachimBreitner在回答中提到的行为相同),因此
将打印
Hello from tmp.hs, line 5!
或
取决于您向ghc提供的是相对文件名还是绝对文件名 您可以使用CPP。如果你编译这个文件
{-# LANGUAGE CPP #-}
main = print __FILE__
当您将源文件传递给ghc
,它将打印源文件的路径,该路径可能是完整路径,也可能不是完整路径,不过:
/tmp $ ghc --make mypath.hs
[1 of 1] Compiling Main ( mypath.hs, mypath.o )
Linking mypath ...
/tmp $ ./mypath
"mypath.hs"
/tmp $ ghc --make /tmp/mypath.hs
Linking /tmp/mypath ...
/tmp $ ./mypath
"/tmp/mypath.hs"
作为替代方案,可以在此处使用该软件包。它使用模板haskell嵌入文件/目录
这对于在可执行文件中嵌入资源或配置非常有用。但是,以这种方式读取样本输入可能是不可取的<代码>数据文件在阴谋集团中可能是更好的选择,正如本帖前面已经指出的。你所说的“当前文件”是什么意思?正在运行的已编译可执行文件的路径?还是模块的源文件?还是别的?@shang,对不起,我指的是源文件。但它似乎不包括目录。@JoachimBreitner行为与您的解决方案相同-请参阅我的更新答案OK,抱歉没有检查我自己就怀疑。没问题-事实上,您的评论触发了我进一步的调查,因此,感谢您对我的质疑:-)您可能会遇到与文件嵌入相同的问题,但现在在0.0.10中有一个方便的函数:
{-# LANGUAGE CPP #-}
main = print __FILE__
/tmp $ ghc --make mypath.hs
[1 of 1] Compiling Main ( mypath.hs, mypath.o )
Linking mypath ...
/tmp $ ./mypath
"mypath.hs"
/tmp $ ghc --make /tmp/mypath.hs
Linking /tmp/mypath ...
/tmp $ ./mypath
"/tmp/mypath.hs"