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

Sorting Haskell中的列表输出缺少第一个元素,sorting,haskell,ord,Sorting,Haskell,Ord,我是Haskell的初学者,在使用Ord时我缺少一个概念。我试图通过下面的函数从Haskell的列表中找出唯一的对 pairs:: (Ord a) => [a] -> [(a,a)] pairs[] = [] pairs(x:xs) = [(i, j) | i <- xs, j <- xs, i > j] 对::(Ord a)=>[a]->[(a,a)] 成对[]=[] 成对(x:xs)=[(i,j)| i 我的问题是,为什么要跳过列表的第一个元素xs 它不是跳过

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

pairs:: (Ord a) => [a] -> [(a,a)]
pairs[] = []
pairs(x:xs) = [(i, j) | i <- xs, j <- xs, i > j]
对::(Ord a)=>[a]->[(a,a)]
成对[]=[]
成对(x:xs)=[(i,j)| i
我的问题是,为什么要跳过列表的第一个元素
xs

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

因此,您可能希望使用:

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

因此,这里我们首先获取一个元素
i
,其余的元素存储在
js
中。然后我们迭代
js
。如果
i
j
不相同,我们使用
order2
创建一个两元组,其中第一项大于第二项。

这很有意义:在哪里使用
x
在您的第二个子句中。启用警告将报告
x
由never used定义。
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 xs = [order2 i j | (i:js) <- tails xs, j <- js, i /= j]