2013-11-21 60 views
2

我想知道這是否僅僅是我的問題,以及如何解決這個問題。與Haskell中的System.Directory混淆

我現在在$HOME目錄下,我可以用touch aaa來創建一個文件。

然後我啓動ghci。我可以用import System.Directory來導入這個包。

現在發生問題。如果我嘗試doesFileExist aaa,我會得到True,因爲它確實存在。如果我嘗試doesFileExist ~/aaa,我會得到False !!!

然後是什麼問題?編輯我,如果你發現它不明確。謝謝。

+3

〜是一個Unix的事情,你一般不能依靠Unix shell以外的編程語言來理解它。 –

+0

然後後續的問題是,是否有任何解析FilePath的軟件包像UNIX Shell一樣?那是他們擴展'〜'和通配符模式? –

回答

0

如果你想擴展~像貝殼做,你可以定義一個函數

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

這可以被稱爲

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

即使其他答案足夠好,我也會將其標記爲答案。我從答案中學到了更多。 – eccstartup

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 
+0

是的,它正在工作。但是,我不明白你的意思,因爲我可以使用'doesFileExist aaa',並且我正在尋找一個關於如何讓程序理解「〜」的解決方案或解釋。 – eccstartup

+1

@eccstartup你不能,Haskell不會解析〜就像你的shell一樣。相反,您可以使用像homeDirFile這樣的函數,它將在某個路徑前添加主目錄 – jozefg

2

~擴張不執行,因爲它是外殼的一個特徵。 doesFileExist "/home/your-user/aaa"應該工作。您可能想要使用getHomeDirectorySystem.Directory

1

您可以通過command-qq與系統shell進行交互。

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

而你在這裏創建了~/aaa文件。

+0

這是一個有趣的包。我會看看。 – eccstartup