haskell程序的灵活参数数量

Fre*_*son 0 haskell pattern-matching command-line-arguments io-monad

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

适合这个电话

./myprog tet.

在这种情况下,将get忽略该参数(稍后将是输出数据库文件),并且为匹配文件递归搜索第二个参数.它还允许我只指定一个文件,这是完美的!

但是,我希望能够指明

./myprog tet path1 path2 path4 file1

但这当然在模式匹配中失败了:

./myprog tet..

myprogt:用户错误(myprog.hs中的do表达式中的模式匹配失败:11:9-22)

现在,我如何使这个程序更灵活,以便我可以采取两个以上的参数?

很抱歉这个问题,但是我的Haskell知识是有限的,但是在我的第一个项目中我必须做的每件新事情都在增加.

Bak*_*riu 5

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

(dbFile:inputs) <- getArgs
Run Code Online (Sandbox Code Playgroud)

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

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

files <- mapM findFiles input
mapM_ putStrLn $ concat files
Run Code Online (Sandbox Code Playgroud)

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


请注意,要解析命令参数,您可以考虑使用某些模块getopt.你也应该阅读页有关参数处理.