Haskell 解析命令行参数

Haskell 解析命令行参数,haskell,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。 但是如果我

我尝试在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替换length,用Integer替换Int,那么执行就会产生错误

test: Prelude.read: no parse

有人能解释一下怎么做吗?

通过
getArgs
返回的列表将如下所示:
[“2”、“10”、“10”、“7”、“3”、“5”、“4”、“4]”]
。前三个字符串是整数的有效字符串表示形式,但其他字符串不是。因此,当您在这些上使用
read
时,您将得到一个错误

计算长度时没有看到错误的原因是
length
不必查看列表中的值,因此不会计算
read
s

然而,为了求和这些值,确实需要对它们进行评估。这就是为什么你会得到一个例外

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

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