gpt4 book ai didi

haskell - Haskell 中的乘法列表

转载 作者:行者123 更新时间:2023-12-02 15:57:43 25 4
gpt4 key购买 nike

如何实现一个函数,将列表中的每个元素乘以另一个列表中对应的元素?例如,给定列表 [1, 2, 3][4, 5, 6] 返回 [4, 10, 18] ?我的代码如下:

calcArea :: [Int] -> [Int] -> [Int]
calcArea length width = length * width

最佳答案

@ForceBru 已经写了一个非常好的答案,但我想探索如何自己编写这种函数。

首先,我们可以编写类型签名。你已经拥有了:

calcArea :: [Int] -> [Int] -> [Int]

现在我们可以写出两个参数可以采用的四种不同情况:

calcArea []     []     = -- TODO: case 1
calcArea (a:as) [] = -- TODO: case 2
calcArea [] (b:bs) = -- TODO: case 3
calcArea (a:as) (b:bs) = -- TODO: case 4

第一种情况很简单:

calcArea [] [] = []

但是第二个和第三个更难。在这里,我将决定“截断”列表,以便 calcArea [1,2,3] [] = [] 。此外,这意味着与相同大小的列表一起使用。如果这不是该函数应有的行为方式,您可能需要更改它。 (请注意,这就是 zipWith 的行为方式。)此外,由于我们不引用列表的元素,因此我们可以编写 _而不是(a:as)(b:bs)像以前一样。

calcArea _ [] = []
calcArea [] _ = []

(另请注意,这些情况与第一个情况重叠,因此我们可以完全删除第一个情况)

最后,我们有案例 4。显然我们想要 a * b在某个列表中,让我们从它开始:

calcArea (a:as) (b:bs) = (a * b) : --???

此时,我们意识到calcArea as bsas 前两个元素的乘积和bs ,然后calcArea列表的其余部分!也就是说calcArea [1,2,3] [4,5,6] = (1 * 4) : calcArea [2,3] [5,6] 。所以我们可以重复:

calcArea (a:as) (b:bs) = (a * b) : calcArea as bs

所以,完整的功能是:

calcArea :: [Int] -> [Int] -> [Int]
calcArea [] _ = []
calcArea _ [] = []
calcArea (a:as) (b:bs) = (a * b) : calcArea as bs

请注意,这相当于 calcArea = zipWith (*)

我希望这可以帮助您将来在 Haskell 中编写更复杂的函数。

关于haskell - Haskell 中的乘法列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47003565/

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