无法将数字列表扫描到元组列表中

时间:2016-06-09 23:44:57

标签: haskell

我正在尝试扫描列表列表并返回2元组列表,第一项是子列表,第二项是子列表的总和。这是功能:

listToTups :: (Num a) => [[a]] -> [([a], a)]
listToTups x = scanl (\acc item -> (item, sum item) : acc) [] x

当我尝试编译时,我收到此错误:

Couldn't match expected type `([a], a)' with actual type `[a0]'
    In the second argument of `scanl', namely `[]'
    In the expression:
      scanl (\ acc item -> (item, sum item) : acc) [] x

这没有意义,因为lambda函数显然返回了一个元组列表。我做错了什么?

更新

这就是我想要做的。给定[Int]列表,我想返回一个2元组列表,第一个元素是子列表本身,第二个元素是总和。如下所示:

[[1,2,3], [4,5,6]] -> [([1,2,3], 6), ([4,5,6], 15)]

我该怎么做?

1 个答案:

答案 0 :(得分:4)

由于

scanl :: (b -> a -> b) -> b -> [a] -> [b]

你要求

scanl _ _ :: Num c => [[c]] -> [([c], c)]

我们得出结论:b必须是([c], c)(通过统一scanl的返回类型和提供的类型签名的返回类型)。但是,你也要求

scanl _ []

格式正确,我们从中得出结论b必须是[d](通过将第二个参数的类型统一为scanl和类型[]) 。这两个约束 - b是元组类型而b是列表类型 - 不兼容。

你对你想要实现的目标的描述对我来说并不是那么清楚,而且从代码中也不是很明显,因此我无法就如何修复它提供太多建议。我只能希望上面对问题的描述足够清楚,它可以帮助你找到适合自己的解决方案。