Haskell getArgs类型是`Char`而不是`[Char`]。

问题描述 投票:2回答:2

我正试图让命令行参数与Haskell一起工作。 我目前有

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

然而,当我编译时,我被告知args的类型是 Char,不 [Char]因此,我无法打开这个文件。在 Haskell 中是否有其他方法来获取参数,或者我的参数获取方式不正确?

list haskell char command-line-arguments
2个回答
7
投票

openFile :: FilePath -> IOMode -> IO Handle 需要一个 FilePath 和一个 IOMode 并给出了 IO Handle.

这意味着

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

声称 args 有型 FilePath. 然而,该类型的 getArgs :: IO [String] 也就是说 args 是一个 [String],不是 FilePath. 这意味着,你正在调用 openFile 的字符串列表,而不是一个文件路径。

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

这里有一个使用模式匹配的例子。

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"

0
投票

事实证明,这只是一个简单的解析问题,下面的代码就可以工作了。

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

你必须解析参数。

© www.soinside.com 2019 - 2024. All rights reserved.