2015-10-21 17 views
1

我想获得命令行参数与Haskell一起工作。我现在有如何在Haskell中获取命令行参数?

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

然而,当我编译据我所知,参数表是Char类型,而不是[Char]的,因此,我无法打开该文件。是否有另一种方法来接受Haskell中的争论或者我错误地采取了我的观点?

回答

5

openFile :: FilePath -> IOMode -> IO Handle需要FilePathIOMode并给出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" 
-1

事实证明,这是分析一个简单的问题,下面的代码工作

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

你要解析的说法。