gpt4 book ai didi

haskell - 如何对列表中的一对元素求和?

转载 作者:行者123 更新时间:2023-12-02 14:52:19 25 4
gpt4 key购买 nike

我试图从列表中取出该对的第一个和第二个元素,以便将它们相加。这是我的代码,我不确定为什么会出错

func :: [(Double,Double)] -> (Double,Double)
func [(x, y)] = map fst (x,y)

最佳答案

首先,让我们采用您当前的非工作定义:

func :: [(Double,Double)] -> (Double,Double)
func [(x, y)] = map fst (x,y)

这有几个问题:

  • 你的模式匹配 [(x, y)] 只匹配一个只有一个元素的列表。任何包含 2 个或更多元素的列表都会导致错误,因为它们不匹配。
  • map 不能应用于元组;它只能应用于列表。
  • 即使您可以map 一个元组,fst 也必须直接应用于一个元组 - fst (a, b) 给出 a,而map fst(a, b)没有意义。

让我们看看一些替代定义。

列表理解

func_1 :: [(Double,Double)] -> (Double,Double)
func_1 list =
let fsts = [ a | (a, _) <- list ]
snds = [ b | (_, b) <- list ]
in (sum fsts, sum snds)

这分别从列表中提取每个第一个元素,然后从列表中提取每个第二个元素,然后将它们相加。

映射

func_2 :: [(Double,Double)] -> (Double,Double)
func_2 list =
let fsts = map fst list
snds = map snd list
in (sum fsts, sum snds)

fst 映射到输入列表的每个元素上,以获取列表中所有第一个元素的列表。然后映射 snd 以对第二个元素执行相同的操作。

递归

func_3 :: [(Double,Double)] -> (Double,Double)
func_3 [] = (0, 0)
func_3 ((a,b) : xs) =
let (a', b') = func_3 xs
in (a+a', b+b')

有点不同的方法。 Haskell 中的列表是递归形成的:[a, b, c] 等同于 (a : (b : (c : [])))。这意味着我们可以使用模式匹配来获取列表的第一个元素以及列表的所有其他元素。该定义分为两部分:

  • 如果列表没有元素,则返回 (0, 0)(基本情况)。
  • 如果列表至少有一个元素,则取出列表的其余部分(例如 [b, c] 如果给出了 [a, b, c],或 [] 如果给出了 [a]),再次使用 func_3 计算它的总和,然后重新添加第一个元素。

关于haskell - 如何对列表中的一对元素求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55013159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com