我尝试在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
有人可以解释一下如何做到这一点吗?
答案 0 :(得分:6)
ng --version
返回的列表如下所示:getArgs
。这些字符串中的前三个是整数的有效字符串表示形式,但其他字符串则不是。因此,当您对这些内容使用["2", "10", "10", "[7,", "3,", "5,", "4,", "4]"]
时,您将收到错误。
在计算长度时没有看到错误的原因是,read
不必查看列表中的值,因此length
永远不会评价。
然而,为了对这些值求和,它们肯定需要进行评估。这就是为什么你得到例外的原因。
为了解决您的问题,您可以将参数的格式更改为不包括括号和逗号,或者手动浏览参数并删除括号和逗号,然后再将它们传递给read
。
另一种选择是将后面的参数连接在一起,用空格分隔(所以你最终得到" [7,3,5,4,4]")然后将其传递为单个字符串到read
,类型为read
。