从文件或命令行参数 haskell 读取



我正在为我用Haskell编写的程序设计IO。 我希望能够使用-f或默认情况下从命令行从文件中读取一些参数。 命令行参数被分成方便的块,这意味着我不需要解析它们。 但是,从文件读取时不会发生这种情况。 所以我写了一个简单的小解析器来做我想做的事。

parseFile :: String -> [String]
parseFile [] = [""]
parseFile ('"':xs) = parseString xs '"'
parseFile (''':xs) = parseString xs '''
parseFile (' ':xs) = "":parseFile xs
parseFile ('t':xs) = "":parseFile xs
parseFile ('n':xs) = "":parseFile xs
parseFile (s:xs) = ((a:xa)->(a++[s]):xa)$ parseFile xs
parseString :: String -> Char -> [String]
parseString (s:xs) a
| s == a = "":parseFile xs
| otherwise = ((a:xa)->(a++[s]):xa)$ parseString xs a

我以为这会很简单,我会做一些类似的事情

let myInput = if (flagDetected) then (parseFile $ readFile $ last args) else (args)

但是,readFile的结果是IO操作而不是字符串,因此我无法解析它。 我尝试了许多配置,但都失败了,主要是出于打字原因。 我尝试在解析之前分配结果,这导致args([[Char]](和readFile的结果(这是使用System.Environment模块中的getArgs的结果(和 的结果(仍然是 IO 字符串(。 我尝试用return包装args,这当然不能解决这个问题,因为类型不匹配。 我现在真的不知所措。 我觉得这可能是我思考这个问题的方式有问题。

我怎样才能得到我想要的行为?

这是我之前问的一个相关问题。 问题的根源是相同的,但最后一个问题的答案非常具体,无法在这里帮助我。这对我来说似乎是一个常见的问题。

您需要在数据流中进行控制反转。Haskell 的IO数据类型用于管理 I/O 操作的影响。从文件中读取字符串不是事实,该文件不存在,可以为空等。可能发生许多可能性。因此,出于这个原因main函数使用基于IO。从 IO 中"提取"包装值的方法是使用do-return

inputIO = if flagDetected then
do 
cnt <- (readFile path)
return (parseFile cnt)
else return args
main = do
input <- inputIO
return yourProgram input

看这里

最新更新