为什么我的 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
是空的。因此,如果您希望您的程序始终从标准输入读取,则根本不要使用命令行参数并从标准输入而不是文件中读取。
如果您希望您的程序仅在未提供文件名时才从标准输入读取,请先检查参数的长度,然后根据给定文件名或从标准输入读取。
我试图通过提供文件名作为命令行参数来读取 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
是空的。因此,如果您希望您的程序始终从标准输入读取,则根本不要使用命令行参数并从标准输入而不是文件中读取。
如果您希望您的程序仅在未提供文件名时才从标准输入读取,请先检查参数的长度,然后根据给定文件名或从标准输入读取。