[英]Flexible number of arguments to haskell program
我正在使用filemanip的System.FilePath.Find
模塊來遞歸地找到我需要處理的所有文件(在這里,我將僅使用打印作為要執行的操作來控制台,以免造成混淆)。 現在,此代碼:
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 file1
但這當然在模式匹配中失敗了:
./myprog tet。 。
myprogt:用戶錯誤(在myprog.hs:11:9-22的do表達式中模式匹配失敗)
現在,如何使該程序更靈活,以便可以接受兩個以上的參數?
抱歉,實際上我很抱歉,但是我對Haskell的了解有限,但是我在第一個項目中要做的每件事都在增加。
好吧,您可以使用其他模式,例如:
(dbFile:inputs) <- getArgs
其中dbFile
將匹配傳遞的第一個參數,而inputs
將匹配任意數量的文件名(甚至0
如果要至少一個路徑名,請使用inputs@(_:_)
而不是簡單的inputs
)。
然后,您可以使用mapM
為inputs
每個路徑調用findFiles
:
files <- mapM findFiles input
mapM_ putStrLn $ concat files
代替mapM
您可以修改findFiles
以接受[FilePath]
參數,而不是簡單的FilePath
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.