我正在为我在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。问题的根源是相同的,但最后一个问题的答案远非特定,以帮助我。对我来说这似乎是一个经常出现的问题。
答案 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