0

我正在使用System.FilePath.Findfilemanip 模块递归地查找我需要处理的所有文件(这里我将仅使用打印到控制台作为要执行的操作,以免混淆事物)。现在,这段代码:

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 知识是有限的,但我在第一个项目中必须做的每件新事情都会增加。

4

1 回答 1

5

好吧,您可以使用不同的模式,例如:

(dbFile:inputs) <- getArgs

wheredbFile将匹配传递的第一个参数,而inputs将匹配任意数量的文件名(甚至0. 如果您想要至少一个路径名,请使用inputs@(_:_)而不是简单的inputs)。

然后你可以使用mapM调用findFiles每个路径inputs

files <- mapM findFiles input
mapM_ putStrLn $ concat files

而不是mapM您可以修改findFiles以接受[FilePath]参数而不是简单的FilePath.


请注意,要解析命令参数,您可以考虑使用一些模块,例如getopt. 您还应该阅读有关参数处理的此页面。

于 2014-09-19T09:24:17.563 回答