是否可以在Haskell中获取当前源文件的绝对路径?
我只能从System.Directory
找到一个相关函数:getCurrentDirectory
,但它“返回调用进程当前目录的绝对路径。”,而不是当前文件的路径。 / p>
(我需要它来读取与源文件位于同一文件夹中的示例输入;如果有更好的方法,那也会有帮助!)
答案 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提供了相对或绝对文件名。