我有一个元组列表:
myList = [(1,1000), (2,2000), (3,3000),(4,4000]
我想处理这个列表,以便每个元组的第一个元素保持不变,第二个元素是累积元素。所以对于上面的myList,它看起来像这样:
[(1,1000),(2,3000),(3,6000),(4,10000)]
我尝试编写一个使用scanl1
但不会编译的函数:
myFunction myList = scanl1 f l
where f = (\acc (x,y) -> (x, acc + y))
任何帮助,非常感谢
答案 0 :(得分:5)
首先,问题有一个拼写错误:它应该是myList
,而不是l
中的myFunction myList = scanl1 f l
。
主要问题是scanl1
的第一个参数应该是a -> a -> a
类型,但您的扫描函数f
的类型为Num c => c -> (b, c) -> (b,c)
,并且没有办法统一类型如果同时包含a = c
和a = (b,c)
(即c = (b,c)
,则“无法构造无限类型”错误。)
解决此问题的方法是记住scanl1 f
将f
应用于上一个结果和列表中的下一个项目,在本例中为(x,y)
两种形式。这给出了:
myFunction myList = scanl1 f myList
where f (_,acc) (x,y) = (x, acc + y)
(注意。下划线表示未使用的参数。)