如何总结Haskell中列表中列表中的值?

时间:2016-11-20 18:38:21

标签: list haskell sum

当我尝试学习Haskell只是为了娱乐和体验我没有其他可能性,而不是问你一个初学者的“哑”问题^^。 我偶然发现了如何在列表中找到列表的总和,例如: [[1,3],[4,7],[2,5]] = [4,11,7],到目前为止我没有找到解决办法。有没有人知道这在Haskell中是如何工作的?

2 个答案:

答案 0 :(得分:1)

您可以使用sum对列表求和,并且可以使用map将任何函数应用于列表的每个元素,因此您要查找的函数是:

map sum

应用此功能时:

map sum [[1,3],[4,7],[2,5]]

你得到了[4,11,7]。会发生的事情是map 遍历在外部列表上并继续将它获取的函数作为其第一个参数(在本例中是sum函数)应用于每个元素。同时,map将结果收集到输出列表中。因此,sum已应用于[1,3],结果为4[4,7],结果为11[2,5]的结果为7 },所有这些都放在列表[4,11,7]中。

答案 1 :(得分:1)

考虑功能类型,它可能有所帮助。

您有[[Int]],并希望功能[[Int]] -> [Int]获得[Int]

您想要的功能是map sum :: [[Int]] -> [Int]

以下代码在ghci

中运行

首先你有一份整体清单。请注意,在此示例中,您需要使用ghci指导[[Int]]以获取所需的类型,而不是令人困惑的通用[[1,3],[4,7],[2,5]] :: Num t => [[t]]

Prelude> let xs = [[1,3],[4,7],[2,5]] :: [[Int]]

接下来,您可能已经知道sum,请为[Int]而不是通用sum :: (Foldable t, Num a) => t a -> a制作一个,这样可以更轻松地阅读

Prelude> let sumInts = sum :: [Int] -> Int

接下来,让我在sumInts

的某个元素上测试xs = [[1,3],[4,7],[2,5]]
Prelude> :t sumInts [1,3]
sumInts [1,3] :: Int
Prelude> sumInts [1,3]
4

现在,您可以对列表中的元素执行sum,将其添加到您可以使用的整个列表中map

Prelude> :t map
map :: (a -> b) -> [a] -> [b]

让我们看看您是否将sumInts传递给地图会获得哪种类型?

Prelude> :t map sumInts 
map sumInts :: [[Int]] -> [Int]

这应与xs :: [[Int]]一起使用,但请先检查类型以确保

Prelude> :t map sumInts xs
map sumInts xs :: [Int]

现在进行计算

Prelude> map sumInts xs
[4,11,7]

sumInts = sum起,这也意味着sum也会起作用

Prelude> :t map sum xs
map sum xs :: [Int]
Prelude> map sum xs
[4,11,7]

注1:map sum实际类型为map sum :: (Foldable t, Num b) => [t b] -> [b])在最后一个示例中,它是由xs的[[Int]]类型推断为[[Int]] -> [Int]