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

标签 haskell command-line-arguments stdin

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

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

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

最佳答案

在大多数程序中,interact很快被getContentsputStr替代。这是因为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)

关于haskell - 如何在具有命令行参数的Haskell程序中读取stdin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44505728/

相关文章:

pipe - 如何通过管道将输出传输到 Visual Studio Code 中?

Python:获取按键事件并输出其他内容

haskell - 为什么状态单子(monad)通常使用 newtype 而不是 type

haskell - Haskell 数据类型中的类型类

list - 如何用惯用的方式编写这个函数?

php - argv 和 argc 未定义或为空

python - 在 python3 中还有其他验证命令行参数的方法吗?

haskell - Backwards 是否承认 Monad 实例?

c++ - 在 Win32 控制台应用程序中读取命令行参数时出错?

c - 为什么网络连接中断会导致 stdin 上出现 EOF?