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",而 xs
是 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
。如果 i
和 j
不相同,我们使用 order2
创建一个第一项大于第二项的二元组。
我是 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",而 xs
是 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
。如果 i
和 j
不相同,我们使用 order2
创建一个第一项大于第二项的二元组。