为什么我的 Haskell 程序不接受标准输入重定向?

Why does my Haskell program not accept standard input redirection?

我试图通过提供文件名作为命令行参数来读取 Haskell 中的文件。 我了解到您可以通过以下方式完成此操作:

./program < input.txt

我写了这段代码:

main = do
    [fileName] <- getArgs
    file <- readFile fileName
    print file

但我收到此错误:"pattern match failure in do expression"。如果我省略 < 符号就可以了,这是完成此操作的唯一方法吗?我宁愿不忽略它。我应该改变什么?

如果您 运行 ./program arg 那么 arg 将作为参数传递。标准输入保留为默认值——通常从终端的键盘读取。

如果你 运行 ./program < filename 那么没有参数被传递给程序。标准输入现在被重定向,以便从文件 filename.

中读取

这就是 OS shell 的工作原理。

在Haskell中,getArgs获取程序参数。在第二种情况下,它们是空的,[fileName] <- getArgs 失败并出现 运行 时间错误。

./program < input.txt 使用 0 个参数调用程序并将标准输入重定向到 input.txt.

的内容

所以你得到一个模式匹配错误,因为 getArgs 是空的。因此,如果您希望您的程序始终从标准输入读取,则根本不要使用命令行参数并从标准输入而不是文件中读取。

如果您希望您的程序仅在未提供文件名时才从标准输入读取,请先检查参数的长度,然后根据给定文件名或从标准输入读取。