list - Haskell getArgs 类型是 `Char` 而不是 `[Char` ]

标签 list haskell char command-line-arguments

我正在尝试获取命令行参数以使用 Haskell。我现在有

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

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

最佳答案

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"

关于list - Haskell getArgs 类型是 `Char` 而不是 `[Char` ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33270692/

相关文章:

Pythonic 获取数组元素,如果不存在则获取默认值

r - 动态创建UI

haskell - 使基本 Haskell 类型成为新类型类的实例

Python 组合字典中的项目

haskell - 如何在 GHC 中仅为旧版本定义功能?

sql - 在 Haskell/Persistent 中使用没有 ID 列的 SQL 表

c++ - 为什么指向按值传递的 char 的指针找不到空终止符?

c - 使用动态内存分配设置 char 数组的确切大小

java - 字节 [] 到字符 []

python - 如何从 QVariant 获取 Python 列表