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