当前位置: 首页 > 知识库问答 >
问题:

Haskell比较了两个列表的长度,但其中一个是无限的?

阎成天
2023-03-14

我想写一个函数来检查第一个列表是否比第二个列表长,并且其中一个列表可以是无限的。但是我找不到一个工作的解决方案。

isLonger :: [a] -> [b] -> Bool
isLonger a b 
        | listLength a > listLength b = True
        |otherwise = False

listLength :: [a] -> Integer
listLength = foldr (flip $ const . (+1)) 0

共有2个答案

丘普松
2023-03-14

简单的旧自然数不会起作用,因为你无法在有限的时间内计算无限列表的自然数长度。然而,懒惰的自然数可以做到这一点。

import Data.Function (on)

data Nat = Z | S Nat
  deriving (Eq, Ord)

len :: [a] -> Nat
len = foldr (const S) Z

isLonger :: [a] -> [b] -> Bool
isLonger = (>) `on` len

使用列表来表示惰性自然数,可以更简洁地实现这一点。

isLonger :: [a] -> [b] -> Bool
isLonger = (>) `on` (() <$)

当然,如果两个列表都是无限的,那么无论你做什么,你都注定会陷入无限循环

司寇琨
2023-03-14

@dfeuer的解决方案胜在聪明,但就更典型的解决方案而言...

评论中提到的一个合理的方法是并行处理两个列表,并找出哪一个先“用完”——这是较短的列表。一个简单的解决方案是在两个列表都非空时递归:

isLonger :: [a] -> [b] -> Bool
isLonger (x:xs) (y:ys) = isLonger xs ys

并在其中一个列表变为空时返回答案:

isLonger []     _  = False   -- list a <= list b
isLonger _      [] = True    -- list a > list b

如果两个列表同时运行(长度相等),第一个模式将匹配,以便在平局的情况下确定答案。

 类似资料:
  • 我有两个表,分别是产品和采购: PRODUCTS表-将获得购买的所有新产品。这意味着表prroducts中不存在相同的productname。所有独特产品列表 采购表-具有唯一purchase_id的所有采购产品的列表。 > 如果要在PURCHASE中添加或插入值,表PRODUCTS将获得PURCHASE的所有值,但前提是PURCHASE中的productname不存在于PRODUCTS中的'pr

  • 问题内容: 假设我有两个表,表A和表B,并且我想比较某个列。 例如, 表A包含以下列:IP,主机,应用 表B具有以下列:IP,数据中心,服务器,模型,最后更新 如何比较两个表之间的IP列以获取差异? 我知道表是否具有相同的列,我可以使用并集和“减号”来获取差异,但是我无法找出表具有不同列的方式。 谢谢! 问题答案: 这将输出两个表中不匹配行的所有列,并且在任一侧都有NULL。

  • 我有一个关于列表比较器的问题。我有一个带有表格的网页应用程序。我可以在这个表格中编辑数据,也可以删除行。当我编辑数据时,标准比较器工作正常,但当我删除行时,我有问题。这个问题很常见(我想),当我删除一行时,javers比较旧列表和现在的列表时,看起来是这样的:旧列表有两个对象,现在列表有一个对象(我删除了第一个),现在javers不知道哪个对象被删除了,他比较旧列表中的第一个对象和新列表中的第二个

  • 问题内容: 我有两个列表(不是Java列表,可以说两列) 例如 我想要一个返回多少个相同元素的方法。对于此示例,它应该为3,并且应该返回列表的相似值和不同的值。 如果是,我应该使用哈希图,然后用什么方法获得结果? 请帮忙 PS:这不是学校作业:)因此,如果您只是指导我就足够了 问题答案: 编辑 这是两个版本。一种使用,另一种使用 比较它们并从中创建您自己的版本,直到获得所需的内容。 这应该足以覆盖

  • 所以我有一个等式,它返回一个给定int的列表。我想把它放到另一个等式中,看看长度是1还是2,如果长度是1,则返回True,如果长度不是,则返回False。 这是我能得到的最接近的结果,但它抛出了错误

  • 问题内容: 我有两个表,想要像这样在sqlite上比较行 我想产生这样的结果 sqlite中的语法如何?谢谢 问题答案: