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

时间:2014-01-09 08:26:21

标签: haskell

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

我只能从System.Directory找到一个相关函数:getCurrentDirectory,但它“返回调用进程当前目录的绝对路径。”,而不是当前文件的路径。 / p>

(我需要它来读取与源文件位于同一文件夹中的示例输入;如果有更好的方法,那也会有帮助!)

3 个答案:

答案 0 :(得分:5)

您可以使用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"

答案 1 :(得分:4)

作为替代方案,可以在此处使用file-embed包。它使用模板haskell来嵌入文件/目录。

这对于在可执行文件中嵌入资源或配置非常有用。但是,以这种方式读取样本输入可能并不可取。如前所述,在cabal中data-files可能是更好的选择。

答案 2 :(得分:0)

PseudoMacros package可能有用。根据描述,它为当前文件名等提供类似C的字符串。

更新

PseudoMacros返回的文件名等于传递给ghc的路径(与答案中提到的@JoachimBreitner相同),所以

 import PseudoMacros

 main :: IO ()
 main = putStrLn ("Hello from " ++ $__FILE__ ++ ", line " ++ show $__LINE__ ++ "!")

将打印

Hello from tmp.hs, line 5!

Hello from /tmp/tmp.hs, line 5!

取决于您是否为ghc提供了相对或绝对文件名。