gpt4 book ai didi

list - 使用 zipWith 计算列表元素的差异

转载 作者:行者123 更新时间:2023-12-02 14:50:53 28 4
gpt4 key购买 nike

我必须创建一个名为 differences 的函数,在其中我使用 zipWith 计算每对的差异并将其放入列表中。

例如 差异 [1..5] == [1, 1, 1, 1]

所以 [2-1, 3-2, 4-3, 5-4] == [1, 1, 1, 1]

我想像这样制作元组列表:

[1..5] = [(1,2), (2,3), (3,4), (4,5)]

然后像这样使用列表推导:

[zipWith (-) a b | a <- y, b <- x]

其中 x 是元组的第一个元素,y 是第二个元素。

函数类型是differences::Num a => [a] -> [a]

最佳答案

你快到了——但是 zipWith 本身返回一个列表,所以你不想把它放在列表理解中,除非你希望结果是列表的列表(你不要,在这里)。

zipWith (-) 在这里绝对是正确的想法 - 它需要 2 个列表并通过取给定列表的相应元素之间的差异给出一个新列表。在您的情况下,您的输出列表旨在比一个输入列表短 1 个元素,并且您想在 2 个列表上使用 zipWith (-),其中包括:

  • 给定列表的所有元素,除了第一个
  • 给定列表的所有元素,除了最后一个

Haskell 已经为我们提供了方便的函数,即 tailinit .

所以你要找的函数是:

differences xs = zipWith (-) (tail xs) (init xs)

请注意,这并不理想,因为如果 xs 为空,inittail 都会使您的程序崩溃并出现丑陋的运行时错误.如果您向此函数提供一个空列表,则输出一个空列表是有意义的(尽管您可以争辩说它不是,因为您将从单例列表中获得一个空列表),因此您可以通过定义通过模式匹配来显式满足空列表的功能:

differences [] = []
differences xs = zipWith (-) (tail xs) (init xs)

虽然我个人认为这很好,而且非常明确,但您实际上不需要同时使用 inittail - zipWith如果出现长度不等的列表,它会很好地工作,当它只是将较大的列表缩小到大小时。所以 differences xs = zipWith (-) (tail xs) xs 是一个可行的、稍微简洁的替代方案。

关于list - 使用 zipWith 计算列表元素的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55778450/

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