我正试图让命令行参数与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"
事实证明,这只是一个简单的解析问题,下面的代码就可以工作了。
args <- getArgs
let incomming = head args
handle ← openFile incomming ReadMode
你必须解析参数。