gpt4 book ai didi

sorting - Haskell 列表输出中缺少第一个元素

转载 作者:行者123 更新时间:2023-12-01 04:38:54 25 4
gpt4 key购买 nike

我是 Haskell 的初学者,在使用 Ord 时缺少一个概念。我正在尝试通过下面的函数从 Haskell 的列表中找出唯一的对

pairs:: (Ord a) => [a] -> [(a,a)]
pairs[] = []
pairs(x:xs) = [(i, j) | i <- xs, j <- xs, i > j]

例如,如果我想获得唯一的 [4,3,1,2] 对,我应该得到输出[(4,3),(4,1),(4,2),(3,1),(3,2),(2,1)]

但我得到的是 [(3,1),(3,2)]。

我的问题是,为什么要跳过列表 xs 的第一个元素?

谢谢。

最佳答案

My question is, why is this skipping the first element of the list xs?

它不会跳过列表 xs 的第一个元素。它只是跳过 x(x:xs) 是一种模式,其中 x 是列表的“头”(第一项),而 xs 是 <列表的 em>tail(包含剩余元素的列表)。

因此您可能想要使用:

pairs:: (Ord a) => [a] -> [(a,a)]
pairs <b>xs</b> = [(i, j) | i <- xs, j <- xs, i > j]

因此,我们在这里捕获了整个列表 xs

如果顺序不是很重要,我们可以通过计算最小值和最大值并迭代尾部来提高效率:

import Data.List(tails)

order2 :: Ord a => a -> a -> (a, a)
order2 x y | x > y = (x, y)
| otherwise = (y, x)

pairs:: (Ord a) => [a] -> [(a,a)]
pairs <b>xs</b> = [order2 i j | (i:js) <- tails xs, j <- js, i /= j]

这里我们先取一个元素i,其余元素存放在js中。然后我们遍历 js。如果 ij 不相同,我们使用 order2 创建一个二元组,其中第一项大于第二项。

关于sorting - Haskell 列表输出中缺少第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58165292/

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