haskell scanl元组

时间:2012-11-12 20:29:24

标签: haskell tuples fold

我有一个元组列表:

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

任何帮助,非常感谢

1 个答案:

答案 0 :(得分:5)

首先,问题有一个拼写错误:它应该是myList,而不是l中的myFunction myList = scanl1 f l


主要问题是scanl1的第一个参数应该是a -> a -> a类型,但您的扫描函数f的类型为Num c => c -> (b, c) -> (b,c),并且没有办法统一类型如果同时包含a = ca = (b,c)(即c = (b,c),则“无法构造无限类型”错误。)

解决此问题的方法是记住scanl1 ff应用于上一个结果和列表中的下一个项目,在本例中为(x,y)两种形式。这给出了:

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

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