0

我正在使用filemanip的System.FilePath.Find模塊遞歸查找所有需要處理的文件(在這裏我將使用打印到控制檯作爲要執行的操作,爲了不混淆的事情)。現在,這個代碼:靈活的參數數量haskell程序

import System.Environment (getArgs) 
import System.FilePath (FilePath) 
import System.Directory (doesDirectoryExist, getDirectoryContents,doesFileExist) 
import Control.Monad 
import System.FilePath.Find (find,always,fileType,(==?),FileType(..),(&&?),extension) 


main= do 
    [dbFile,input]<- getArgs 
    files <- findFiles input 
    mapM_ putStrLn files 
    return() 

searchExtension :: String 
searchExtension = ".hs" 

findFiles :: FilePath -> IO [String] 
findFiles = find (always) (fileType ==? RegularFile &&? extension ==? searchExtension) 

與此調用

./myprog TET效果很好。

在這種情況下,get參數被忽略(將在後面輸出的數據庫文件),第二個參數被遞歸搜索匹配的文件。它也允許我指定一個文件,這是完美的!

,但我希望能夠指定

./myprog TET PATH1 PATH2 PATH4文件1

但這當然失敗的模式匹配:

./myprog tet。 。

myprogt:用戶錯誤(模式匹配失敗在做在myprog.hs表達:11:9-22)

現在,我該如何使這個計劃更靈活,讓我可以超過兩個參數?

對不起,實際上,我的Haskell知識是有限的,但對於我在第一個項目中必須做的每件新事物都是有限的。

回答

5

嗯,你可以像使用不同的模式:

(dbFile:inputs) <- getArgs 

其中dbFile將匹配傳入而inputs將匹配任何數量的文件名(甚至0第一個參數如果你想至少一個路徑名使用[email protected](_:_)而不是簡單的inputs)。

然後你可以使用mapMinputs調用findFiles每個路徑:

files <- mapM findFiles input 
mapM_ putStrLn $ concat files 

相反mapM的,你可以修改findFiles接受[FilePath]參數,而不是一個簡單的FilePath


注意,解析您可以考慮使用一些模塊像getopt命令參數。您還應該閱讀this關於參數處理的頁面。

+0

完美!謝謝! – 2014-09-19 09:46:14