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

时间:2017-07-07 19:16:01

标签: haskell io command-line-arguments

我正在为我在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]](这是getArgs使用System.Environment的结果} {module}和readFile的结果,它仍然是一个IO字符串。  我尝试用args包裹return,由于类型不匹配,当然无法解决此问题。我现在真的失去了想法。我觉得这可能是我思考这个问题的方式的问题。

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

Here's a related question I asked earlier。问题的根源是相同的,但最后一个问题的答案远非特定,以帮助我。对我来说这似乎是一个经常出现的问题。

1 个答案:

答案 0 :(得分:0)

您需要在数据流中进行控制反转.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

Look here