我想获得命令行参数与Haskell一起工作。我现在有如何在Haskell中获取命令行参数?
args ← getArgs
-- opens text file, uses handle for text
handle ← openFile args ReadMode
然而,当我编译据我所知,参数表是Char
类型,而不是[Char]
的,因此,我无法打开该文件。是否有另一种方法来接受Haskell中的争论或者我错误地采取了我的观点?
我想获得命令行参数与Haskell一起工作。我现在有如何在Haskell中获取命令行参数?
args ← getArgs
-- opens text file, uses handle for text
handle ← openFile args ReadMode
然而,当我编译据我所知,参数表是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
你要解析的说法。