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

时间:2017-04-19 15:24:24

标签: haskell terminal command-line-arguments readfile

我正在尝试通过提供文件名作为命令行参数来读取Haskell中的文件。 我已经读过你可以通过以下方式实现这一目标:

./program < input.txt

我写了这段代码:

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

但是我得到了这个错误:“表达式中的模式匹配失败”。如果我省略&lt;签署它是否有效,这是实现这一目标的唯一途径吗?我宁愿不省略它。我应该改变什么?

2 个答案:

答案 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因运行时错误而失败。