gpt4 book ai didi

list - 列表元组的函数

转载 作者:行者123 更新时间:2023-12-05 00:11:54 25 4
gpt4 key购买 nike

如果这个问题很琐碎,我很抱歉,但我一直在努力寻找答案,这就是我决定在这里发布的原因。

我想构建一个函数,它接受一个二进制元组列表:[(Integer, Integer)] 并从所有元组的所有第二个整数中输出最大整数。我写了以下代码:

maxSecond:: [(Integer,Integer)] -> Integer
maxSecond [(ks, as)] = aux (unzip [(ks, as)])
where aux ([ks],[as]) = maximum ([as])

但只有当我输入一个只有 1 个元组的列表并为超过 2 个元组的列表输出“函数中的非穷尽模式”错误时,它才有效。我的问题不是如何实际解决原始问题,而是为什么这种方法在 Haskell 中不起作用?

我还编写了以下函数:
aaa:: ([Integer], [Integer]) -> Integer
aaa ([as],[ms]) = 10

显然不可能在 Haskell 中输入一个列表元组(除非列表不是由 1 个元素组成)。对此有什么解释吗?

谢谢!!

最佳答案

初学者 Haskell 程序员犯的一个常见错误是他们认为 [x]是一个匹配任意长度列表的模式。但是[x]实际上是一个匹配单例列表的模式(一个只有一个元素的列表,该元素“链接”到 x )。

如果我们希望能够处理空列表( [] )或非空列表(长度大于零),我们可以写成模式 x , x将比“链接”到该列表本身。请注意,我们可以使用任何我们想要的标识符。列表的模式匹配当然很有用:例如,处理空列表、缺点、正好包含一、二、三、五等元素的列表的情况。但是这里我们只会限制自己,让事情变得更复杂。

为了计算元组第二项的最大值,我们可以先做一个map来处理。 ping 生成一个元素列表,每个元素对应元组的第二项,然后我们可以计算出maximum该列表中,例如:

maxSecond :: Ord a => [(a, a)] -> a
maxSecond xs = maximum (map snd xs)

因此,我们在这里使用了 map :: (a -> b) -> [a] -> [b] 函数将函数应用于列表中的所有元素 xs ,该函数是 snd :: (c, d) -> d 因此取二元组的第二个元素,然后我们计算 maximum :: Ord e => [e] -> e 以获得该列表的最大值。

我们也可以使用 (.) :: (b -> c) -> (a -> b) -> a -> c 运算符,并将其写为:
maxSecond :: Ord a => [(a, a)] -> a
maxSecond = maximum . map snd

关于list - 列表元组的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52412094/

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