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

Missing first element from list output in Haskell

我是 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 是列表(第一项)的 "head",而 xstail列表(包含剩余元素的列表)。

因此您可能想使用:

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 创建一个第一项大于第二项的二元组。