簡體   English   中英

haskell程序的靈活參數數目

[英]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 )。

然后,您可以使用mapMinputs每個路徑調用findFiles

files <- mapM findFiles input
mapM_ putStrLn $ concat files

代替mapM您可以修改findFiles以接受[FilePath]參數,而不是簡單的FilePath


請注意,要解析命令參數,您可以考慮使用諸如getopt模塊。 你也應該閱讀頁有關參數處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM