我正在编写一个程序,它应该能够直接从命令行或从文件中读取输入,具体取决于传递的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;
但如果输入不是文件名,则会出错。有没有明智的方法来做到这一点?我是否错误地接近了这个问题?
答案 0 :(得分:4)
您试图将(head args)
视为处于IO monad中。由于它只是一个原始值,因此您需要将其置于monad中,然后才能将其用作IO操作。
只需将(head args)
更改为(return (head args))
。
答案 1 :(得分:1)
您可以使用return (head args)
将类型提升为IO
monad。