2017-04-23 153 views
4

我尝试解析haskell中的命令行参数。解析命令行参数

下面是一个示例代码:

import System.Environment 

work :: [Integer] -> Int 
work (s:r:t:es) = length es 

main :: IO() 
main = getArgs >>= putStrLn . show . work . (map read) 

我与执行它:

./test 2 10 10 [7, 3, 5, 4, 4] 

输出是5像预期。 但是如果我更换之和Int长度整数执行引发错误

test: Prelude.read: no parse 

有人能解释如何做到这一点?

回答

6

getArgs返回的列表如下所示:["2", "10", "10", "[7,", "3,", "5,", "4,", "4]"]。前三个字符串是整数的有效字符串表示,但其他字符串不是。所以当你对这些使用read时,你会得到一个错误。

当您计算长度时看不到错误的原因是length不必查看列表中的值,因此从不评估read

但是,为了总结这些值,他们肯定需要评估。所以这就是为什么你会得到一个例外。

为了解决您的问题,您可以将参数的格式更改为不包含括号和逗号,也可以在将参数传递给read之前手动检查参数并删除括号和逗号。

另一种方法是将后面的参数连接在一起,用空格分隔(所以最后以“[7,3,5,4,4]”结尾),然后将其作为单个字符串传递给read请输入[Integer]