1

我有一个元组列表:

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))

任何帮助,非常感谢

4

1 回答 1

5

首先,这个问题有一个错字:它应该是myList而不是lin myFunction myList = scanl1 f l


主要问题是scanl1应该有 type的第一个参数a -> a -> a,但是您的扫描函数f有 type Num c => c -> (b, c) -> (b,c),并且当一个同时具有a = cand时,无法统一类型a = (b,c)​​(即c = (b,c),“无法构造无限类型”错误)。

解决这个问题的方法是记住它scanl1 f适用f于列表中的上一个结果和下一个项目,在这种情况下,两者都是 form (x,y)。这给出了:

myFunction myList = scanl1 f myList
       where f (_,acc) (x,y) = (x, acc + y)

(注意。下划线表示未使用的参数。)

于 2012-11-12T20:40:40.153 回答