如何在Haskell中获取命令行参数?

时间:2015-10-21 23:02:05

标签: list haskell char command-line-arguments

我正在尝试使用命令行参数来使用Haskell。我目前有

args ← getArgs
-- opens text file, uses handle for text
handle ←  openFile args ReadMode

然而,当我编译时,我被告知args的类型为Char,而不是[Char],因此,我无法打开该文件。还有另一种方法可以在Haskell中接受参数,还是我错误地接受了我的参与?

2 个答案:

答案 0 :(得分:8)

openFile :: FilePath -> IOMode -> IO Handle获取FilePathIOMode并获得IO Handle

这意味着

do
  args <- getArgs
  handle <- openFile args ReadMode
  ...

声称args的类型为FilePath。但是,getArgs :: IO [String]的类型表示args[String],而不是FilePath。这意味着您使用字符串列表而不是文件路径调用openFile

要解决此问题,首先我们必须知道FilePath只是String的类型同义词,这意味着我们必须使用args的元素而不是整个列表。< / p>

以下是使用模式匹配的示例:

do
  [arg] <- getArgs
  handle <- openFile arg ReadMode
  ...

但是,如果程序的调用者提供了错误数量的参数,这将导致模糊的运行时错误(由fail从模式匹配失败中生成)。更强大的程序可能会使用更具描述性的失败消息来处理这些情况:

do
  args <- getArgs
  case args of
    [] -> error "must supply a file to open"
    [arg] -> do handle <- openFile arg ReadMode
                ...
    _ -> error "too many arguments"

答案 1 :(得分:-1)

事实证明,这是一个简单的解析问题,以下代码可以正常工作

args <- getArgs
let incomming = head args
handle ←  openFile incomming ReadMode

你必须解析这个论点。