我知道我可以interact :: (String -> String) -> IO ()
在一个简单的Haskell程序中方便地从stdin读取和写入stdout(请参阅http://learnyouahaskell.com/input-and-output)。
现在,我想添加命令行参数以使我的简单程序“可配置”。
有没有办法做到这一点并且仍然使用interact
(以便以最小的努力获得可配置的程序)?
在大多数程序中,interact
很快会被使用getContents
和替代putStr
。这是因为interact
非常有限,因为您只能调用单个函数,并且单个函数必须使用所有输入。随着程序复杂性的提高,您最终将希望将程序分解为较小的函数,do
这些函数可以一次处理一部分输入,并且符号使对这些函数进行排序变得更加容易。
因此,为了模仿interact
但也使用命令行参数,您可以首先执行以下操作:
import System.Environment
doStuff :: [String] -> String -> String
doStuff args input = undefined -- your code here
main :: IO ()
main = do
args <- getArgs
contents <- getContents
putStr (doStuff args contents)
顺便说一下,它与:
main = doStuff <$> getArgs <*> getContents >>= putStr
但是稍后您可能希望添加诸如提示,解析器或文件I / O之类的内容:
import System.Environment
data Arg = Taco | Boring
parseArg :: String -> Arg
parseArg arg = if arg == "taco" then Taco else Boring
doStuff :: Arg -> String -> String
doStuff Taco input = "Yum, tacos! " ++ input
doStuff Boring input = "Meh, " ++ input
main :: IO ()
main = do
[arg] <- map parseArg <$> getArgs
putStr "Enter the file name: "
fileName <- getLine
fileContents <- readFile fileName
writeFile ("output-" ++ fileName) (doStuff arg fileContents)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句