sorting - 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 的第一个元素?
谢谢。
解决方案
我的问题是,为什么这会跳过列表的第一个元素
xs
?
它没有跳过列表的第一个元素xs
。它只是跳过x
。(x:xs)
是一种模式,其中x
是列表的“头”(第一项),而是列表xs
的尾部(包含剩余元素的列表)。
因此,您可能想要使用:
pairs:: (Ord a) => [a] -> [(a,a)]
pairs xs = [(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 xs = [order2 i j | (i:js) <- tails xs, j <- js, i /= j]
因此,这里我们首先取一个元素i
,其余元素存储在js
. 然后我们迭代js
. 如果i
和j
不相同,我们使用order2
创建一个 2 元组,其中第一项大于第二项。
推荐阅读
- python - python检查一个方法是否被调用而不模拟它
- c# - 以编程方式获取 .NET 应用程序设置的路径
- typescript - 在打字稿中执行shell命令
- python - 在python中传递带有前导'0'的变量会引发语法错误
- python - 你安装了mysqlclient吗?
- python - Python反应式KafkaProducer不在线程池上工作
- imshow - 频率波数图python
- linux - 为什么 MongoDb 会因“得到信号:7(总线错误)”而崩溃
- c++11 - 使用 ostream 和打印功能进行打印,具有内部功能
- java - iText PDF:如何在 PDF 中创建指向其他部分的内部链接