解析命令行参数

时间:2017-04-23 12:47:14

标签: haskell

我尝试在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,与预期一致。 但是如果我用sum替换长度,用Integer替换Int,则执行会引发错误

test: Prelude.read: no parse

有人可以解释一下如何做到这一点吗?

1 个答案:

答案 0 :(得分:6)

ng --version返回的列表如下所示:getArgs。这些字符串中的前三个是整数的有效字符串表示形式,但其他字符串则不是。因此,当您对这些内容使用["2", "10", "10", "[7,", "3,", "5,", "4,", "4]"]时,您将收到错误。

在计算长度时没有看到错误的原因是,read不必查看列表中的值,因此length永远不会评价。

然而,为了对这些值求和,它们肯定需要进行评估。这就是为什么你得到例外的原因。

为了解决您的问题,您可以将参数的格式更改为不包括括号和逗号,或者手动浏览参数并删除括号和逗号,然后再将它们传递给read

另一种选择是将后面的参数连接在一起,用空格分隔(所以你最终得到" [7,3,5,4,4]")然后将其传递为单个字符串到read,类型为read