如何在具有命令行参数的Haskell程序中读取stdin?

成为

我知道我可以interact :: (String -> String) -> IO ()在一个简单的Haskell程序中方便地从stdin读取和写入stdout(请参阅http://learnyouahaskell.com/input-and-output)。

现在,我想添加命令行参数以使我的简单程序“可配置”。

有没有办法做到这一点并且仍然使用interact(以便以最小的努力获得可配置的程序)?

4城堡

在大多数程序中,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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Bash脚本中使用GDB运行带有命令行参数的程序?

如何将所有命令行参数传递给Makefile中的程序?

当程序具有命令行参数时,如何使用GDB分析程序的核心转储文件?

如何在EC2上远程执行带有命令行参数的程序(Java程序)?

在Windows 8 / Windows 10中,如何从Search或Start / Metro启动带有命令行参数的程序?

如何使用MinGW在Qt中调试带有命令行参数输入的应用程序?

如何 pip 安装 Python 程序,使其具有命令行快捷方式

获取python中的所有命令行参数

如何在Python中读取整数命令行参数?

如何在Shell Sript中读取命令行参数

如何在没有命令行参数的情况下检查并引发错误

编写一个程序,该程序读取所有命令行参数并打印平均值,c ++

如何在Shell脚本程序中运行具有自己的命令行的程序

如何在 Power Shell 中执行具有多个参数的命令行?

检查是否没有命令行参数且STDIN为空

如何通过Clap将所有命令行参数传递给另一个程序?

在Inno Setup中创建快捷方式以执行带有命令行参数的程序

复制带有命令行参数的命令

Mayavi2具有命令行参数的独立脚本

哪个洪流客户端具有命令行参数来开始/停止下载?

通过带有命令行参数的PSEXEC执行HTA应用程序

在没有CRT编译的程序中,是否可以通过argv读取命令行参数?

带有命令行参数的R optparse错误

具有命令行支持的Ruby内联存储

批处理文件中的%*是否表示所有命令行参数?

批处理文件中的%*是否表示所有命令行参数?

我想将Bash脚本的所有命令行参数存储到单个变量中

如何在java的命令行输入中读取由“/”分隔的两个参数?

在命令行中具有参数的Cron作业