【问题标题】:Missing first element from list output in HaskellHaskell中列表输出中缺少第一个元素
【发布时间】:2019-09-30 09:43:23
【问题描述】:

我是 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 的第一个元素?

谢谢。

【问题讨论】:

  • 这是有道理的:您在第二个子句中在哪里使用x
  • 启用警告将报告 x 定义为从未使用过。

标签: sorting haskell ord


【解决方案1】:

我的问题是,为什么这会跳过列表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。如果ij 不一样,我们使用order2 创建一个第一项大于第二项的二元组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多