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

在无限列表列表上使用foldr

孟跃
2023-03-14

我试图在Haskell中编写一个函数,它可以做以下操作:输入一个整数列表,对于这些整数,使用map,有一个函数应用于它们,返回一个无限的整数列表。然后,我想使用union将foldr应用于列表,这样结果将是列表中这些列表的union。

现在的问题是,当我以10‘函数’[1,2]为例进行计算时,它会首先计算1的无限列表,因为它是一个无限列表,它永远不会对2进行计算。因此,它只返回输入列表中第一个元素的无限列表中的前10个元素,并应用union,这是同一个列表。

我的问题是:有没有一种方法可以同时为输入列表中的所有元素创建无限列表,这样当我以10个“函数”[1,2]为例时,它将返回无限列表中1和2并集的前10个元素。(我不知道输入列表中的元素数)

这是我的代码,让它更清楚:

pow :: Integer -> [Integer]
pow n = map (^n) [1, 2..]

function :: [Integer] -> [Integer]
function xs = foldr union [] (map pow xs)

共有2个答案

孟正志
2023-03-14

如果您想要对输入和输出列表进行排序,请检查data-ordlist。如果您只想要所有的元素,但不关心顺序,请尝试concat。转置

呼延才俊
2023-03-14

Union函数适用于任意列表并删除重复项,因此它必须首先完全评估其中一个参数,然后才能继续处理另一个参数。

我认为您希望明确引入列表已排序的假设,然后您可以编写一个高效的函数来合并(就像合并排序中的合并一样)输入列表并计算联合,而不需要在另一个列表之前评估其中一个列表。

我不知道库中是否存在这样的合并函数,但您可以很容易地自己定义它:

-- | Computes the union of two sorted lists
merge :: Ord a => [a] -> [a] -> [a]
merge [] ys = ys
merge xs [] = xs
merge (x:xs) (y:ys)
  | x <= y    = x : merge (dropWhile (== x) xs) (dropWhile (== x) (y:ys))
  | otherwise = y : merge (x:xs) (dropWhile (== y) ys)

然后,您的原始折叠与这个新的合并函数应该表现为所需的:

ghci> pow n = map (^n) [1..]
ghci> function xs = foldr merge [] (map pow xs)
ghci> take 10 (function [2,3])
[1,4,8,9,16,25,27,36,49,64]
 类似资料:
  • 我知道对无限列表进行排序是不可能的,但我正试图为n个数的倍数的无限递增列表写一个定义。 我已经有这个功能了 它返回n的无限倍数列表。但现在我想构建一个函数,给定一个返回列表中所有数字的倍数的无限递增列表。所以函数

  • 本文向大家介绍js实现列表向上无限滚动,包括了js实现列表向上无限滚动的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了js实现列表向上无限滚动的具体代码,供大家参考,具体内容如下 先来一张效果图 html js css(样式自己调) 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 问题内容: 是否有人在Redis中实现了任何形式的有上限的数据结构?我正在构建类似新闻提要的东西。提要将非常频繁地被操纵和读取,并且将其保存在Redis的分类集中对于我的用例来说是便宜又完美的。唯一的问题是,每个提要仅需要n个项,并且我担心内存溢出,因此我想确保每个提要都不会超过n个项。用Lua在Redis中创建一个有上限的排序集合似乎很简单: update_feed.lua看起来像(未经测试):

  • 在试图使用Haskell定义从连接通道读取的无限循环时,我遇到了一个想法,即使用单子的Kleisli组合折叠一个无限的部分应用函数列表。这个想法似乎很合理,也很简单,但我遇到了一个奇怪的场景,显然无限列表正在被评估,而不是等待输入。

  • 默认情况下,用户创建的Bucket或上传的文件只有自己可以访问,如果想让其它用户或所有人都可以访问,则需要将Bucket或Object授权给相应的访问者。下面是不同权限的意义: 作用域 权限 描述 Bucket READ 列出Bucket下的Objects Bucket WRITE 创建、覆盖和删除Bucket中的Object(通过SSO认证方式除外,见SSO_WRITE) Bucket SSO_

  • 问题内容: 我有以下情况: Python 3.6+ 从文件中逐行读取输入数据。 协程将数据发送到API(使用),并将调用结果保存到Mongo(使用)。因此,有很多IO正在进行。 该代码使用/编写,并且对于手动执行的单个调用也可以正常工作。 我不知道该怎么做,就是要大量使用输入数据。 我看到的所有示例都通过发送有限列表作为参数进行了演示。但是我不能简单地向它发送任务列表,因为输入文件可能有数百万行。