Haskell getArgs 类型是 `Char` 而不是 `[Char`]
Haskell getArgs type is `Char` instead of `[Char`]
我正在尝试获取与 Haskell 一起使用的命令行参数。我目前有
args ← getArgs
-- opens text file, uses handle for text
handle ← openFile args ReadMode
但是,当我编译时,我被告知 args 的类型是 Char
,而不是 [Char]
,因此,我无法打开文件。在 Haskell 中是否有另一种方法来接受参数,或者我是否错误地接受了我的参数?
事实证明,这是一个简单的解析问题,下面的代码有效
args <- getArgs
let incomming = head args
handle ← openFile incomming ReadMode
你必须解析参数。
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"
我正在尝试获取与 Haskell 一起使用的命令行参数。我目前有
args ← getArgs
-- opens text file, uses handle for text
handle ← openFile args ReadMode
但是,当我编译时,我被告知 args 的类型是 Char
,而不是 [Char]
,因此,我无法打开文件。在 Haskell 中是否有另一种方法来接受参数,或者我是否错误地接受了我的参数?
事实证明,这是一个简单的解析问题,下面的代码有效
args <- getArgs
let incomming = head args
handle ← openFile incomming ReadMode
你必须解析参数。
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"