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知识是有限的,但是在我的第一个项目中我必须做的每件新事情都在增加.
好吧,你可以使用不同的模式,如:
(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.你也应该阅读此页有关参数处理.