在Haskell中与`System.Directory`混淆

时间:2013-11-21 06:57:29

标签: haskell ghci

我想知道这对我来说是否只是一个问题,以及如何解决这个问题。

我现在在$HOME目录中,我可以touch aaa创建一个文件。

然后我启动ghci。我可以import System.Directory导入此包。

现在问题出现了。如果我尝试doesFileExist aaa,我会得到True,因为它确实在那里。如果我尝试doesFileExist ~/aaa,我会得到False

那么问题是什么?如果您发现它不清楚,请编辑我。感谢。

4 个答案:

答案 0 :(得分:7)

Haskell与其他几种语言一样,不会将~解析为主目录。 〜只是一个常见的unix shell功能。所以它正在寻找名为〜。

的文字目录

而是尝试

import System.FilePath.Posix
import System.Directory

homeDirFile :: FilePath -> IO FilePath
homeDirFile p = fmap (</>p) getHomeDirectory

main = homeDirFile "aaa" >>= doesFileExist >>= print

答案 1 :(得分:2)

未执行~扩展,因为它是shell的一项功能。 doesFileExist "/home/your-user/aaa"应该有效。您可能希望使用getHomeDirectory中的System.Directory

答案 2 :(得分:1)

您可以通过command-qq与系统shell进行互动。

> import System.Command.QQ
> :set -XQuasiQuotes 
> [sh|touch ~/aaa|] :: IO ()

此处您已创建~/aaa个文件。

答案 3 :(得分:0)

如果你想像shell一样扩展~,你可以定义一个函数

expandHome :: FilePath -> FilePath -> FilePath
expandHome home ('~':xs) = home ++ xs
expandHome home path     = path

这可以称为

λ> h <- getHomeDirectory
λ> expandHome h "~/temp"
"/home/kqr/temp"