Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取Haskell中当前源文件的绝对路径_Haskell - Fatal编程技术网

获取Haskell中当前源文件的绝对路径

获取Haskell中当前源文件的绝对路径,haskell,Haskell,是否可以在Haskell中获取当前源文件的绝对路径 我只能找到一个相关函数:fromSystem.Directory,但它“返回调用进程当前目录的绝对路径”,而不是当前文件的路径 (我需要它来读取与源文件位于同一文件夹中的示例输入;如果有更好的方法,那也会很有帮助!)可能会有用。根据描述,它为当前文件名等提供了类似C的字符串 更新 pseudoAcros返回的文件名等于传递给ghc的路径(与@JoachimBreitner在回答中提到的行为相同),因此 将打印 Hello from tmp.hs

是否可以在Haskell中获取当前源文件的绝对路径

我只能找到一个相关函数:from
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"