条件IO动作

时间:2017-06-11 15:36:42

标签: haskell io

我正在编写一个程序,它应该能够直接从命令行或从文件中读取输入,具体取决于传递的args。例如。但是我无法使IO事件成为条件。我的第一个想法是:

(head args)

然而,这不起作用,因为import System.Environment main :: IO () main = do cla <- getArgs let flags = parseFlags (filter isFlag cla) [] let args = filter (not.isFlag) cla file <- (readFile (head args)) let input = if (elem "e" flags) then (head args) else (file) 不是IO操作。我的下一步想法是:

clear: both;

但如果输入不是文件名,则会出错。有没有明智的方法来做到这一点?我是否错误地接近了这个问题?

2 个答案:

答案 0 :(得分:4)

您试图将(head args)视为处于IO monad中。由于它只是一个原始值,因此您需要将其置于monad中,然后才能将其用作IO操作。

只需将(head args)更改为(return (head args))

答案 1 :(得分:1)

您可以使用return (head args)将类型提升为IO monad。