我正在尝试通过提供文件名作为命令行参数来读取Haskell中的文件。 我已经读过你可以通过以下方式实现这一目标:
./program < input.txt
我写了这段代码:
main = do
[fileName] <- getArgs
file <- readFile fileName
print file
但是我得到了这个错误:“表达式中的模式匹配失败”。如果我省略&lt;签署它是否有效,这是实现这一目标的唯一途径吗?我宁愿不省略它。我应该改变什么?
答案 0 :(得分:4)
./program < input.txt
使用0参数调用程序,并将stdin重定向到input.txt
的内容。
因此,getArgs
为空,因此会出现模式匹配错误。因此,如果您希望程序始终从stdin读取,请不要使用命令行参数并从stdin而不是文件中读取。
如果您希望程序仅在没有给出文件名的情况下从stdin读取,请首先检查参数的长度,然后根据给定的文件名或stdin读取。
答案 1 :(得分:2)
如果您运行./program arg
,那么arg
将作为参数传递。标准输入保留默认值 - 通常从终端的键盘读取。
如果运行./program < filename
,则不会向程序传递任何参数。现在标准输入被重定向,以便从文件filename
中读取。
这就是OS shell的工作原理。
在Haskell中,getArgs
获取程序参数。在第二种情况下,它们是空的,[fileName] <- getArgs
因运行时错误而失败。