Haskell中如何将字符串列表转为整数列表后对元素求和
Haskell字符串列表转整数求和解决方案
你当前编写的convert函数存在两处核心问题:
- 重复定义冲突:第一个
convert定义逻辑是将字符串列表转为整数列表,返回值类型为[Int],第二个定义的逻辑试图递归求和,返回值为Int,类型不匹配无法通过编译 - 列表模式匹配语法错误:Haskell中列表的Cons构造语法为
头元素:剩余列表,正确写法是x:xs,而非你写的xs:x
方法一:调用内置sum函数实现
Haskell标准库Prelude内置了sum函数,可直接计算数值型列表的元素总和,转换为整数列表后直接调用即可:
-- 字符串列表转整数列表 convert :: [String] -> [Int] convert = map read -- 转换后求和 calcTotal :: [String] -> Int calcTotal strList = sum (convert strList)
测试调用calcTotal ["2","76","564"]即可得到结果642。
方法二:手动实现递归求和逻辑
如果需要自己写递归实现求和功能,单独定义求和函数即可,不要和转换逻辑混写:
convert :: [String] -> [Int] convert = map read -- 自定义整数列表求和函数 myListSum :: [Int] -> Int myListSum [] = 0 -- 递归边界:空列表总和为0 myListSum (x:xs) = x + myListSum xs -- 头元素加剩余列表的总和 -- 组合两个函数实现需求 calcTotal :: [String] -> Int calcTotal strList = myListSum (convert strList)
你也可以直接将转换和求和逻辑合并,不需要生成中间整数列表:
calcTotal :: [String] -> Int calcTotal [] = 0 calcTotal (s:ss) = read s + calcTotal ss
内容的提问来源于stack exchange,提问作者01d
相关产品推荐
相关产品推荐

