【问题标题】:How can I sum up the values in lists within lists in Haskell?如何总结 Haskell 列表中列表中的值?
【发布时间】:2016-11-20 18:38:21
【问题描述】:

当我尝试学习 Haskell 只是为了好玩和体验时,我只能问你一个完全初学者的“愚蠢”问题 ^^。 我偶然发现了如何在列表中找到列表总和的问题,例如[[1,3],[4,7],[2,5]] = [4,11,7] 到目前为止我还没有找到解决方案。有人知道这在 Haskell 中是如何工作的吗?

【问题讨论】:

  • 假设你知道如何总结一个列表,看看map :: (a -> b) -> [a] -> [b]
  • 一点头绪都没有,这听起来太难了,怀疑有人做过这样的事情。 ...说真的,您实际上尝试过什么?你有read 任何介绍吗?我总是推荐Learn You a Haskell,这是一个轻松的开始。
  • (无意冒犯——Haskell 一开始肯定会让人感到困惑,但通过一些介绍性材料我相信你会相处得很好。但是要求这样的小例子是无效的,不是你当然不适合 StackOverflow。)
  • 我已经习惯了像 java 这样的命令式语言,距离我第一次通读了解你一个 haskell 已经只有一个星期了......我以前没有见过这样使用 map,所以谢谢小费
  • 查看 Haskell 列表推导。

标签: list haskell sum


【解决方案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

接下来,让我们在xs = [[1,3],[4,7],[2,5]] 的某个元素上测试sumInts

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]

【讨论】:

    【解决方案2】:

    您可以使用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] 中。

    【讨论】:

    • 如果您对答案(或任何其他)感到满意,请接受以关闭此问题
    猜你喜欢
    • 1970-01-01
    • 2023-01-19
    • 2018-07-02
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多