Sorting Haskell中的列表输出缺少第一个元素
我是Haskell的初学者,在使用Ord时我缺少一个概念。我试图通过下面的函数从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 它不是跳过
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]