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

Jak*_*ben 2 haskell list char command-line-arguments

我试图让命令行参数与Haskell一起使用.我现在有

args ? getArgs
-- opens text file, uses handle for text
handle ?  openFile args ReadMode
Run Code Online (Sandbox Code Playgroud)

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

Rei*_*chs 8

openFile :: FilePath -> IOMode -> IO Handle拿a FilePath和an IOMode并给出一个IO Handle.

这意味着

do
  args <- getArgs
  handle <- openFile args ReadMode
  ...
Run Code Online (Sandbox Code Playgroud)

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

要解决这个问题,首先我们必须知道这FilePath只是一个类型的同义词String,这意味着我们必须采用一个元素args而不是整个列表.

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

do
  [arg] <- getArgs
  handle <- openFile arg ReadMode
  ...
Run Code Online (Sandbox Code Playgroud)

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

do
  args <- getArgs
  case args of
    [] -> error "must supply a file to open"
    [arg] -> do handle <- openFile arg ReadMode
                ...
    _ -> error "too many arguments"
Run Code Online (Sandbox Code Playgroud)