haskell 优雅的方式从无限的数字列表中过滤(减少)重复序列

2024-03-17

这是一个产生无限随机数列表的函数

import System.Random
values :: [Int]
values = map fst $ scanl (\(r, gen) _ -> randomR (1,10) gen) (randomR (1,10) (mkStdGen 1)) $ repeat ()

我想将重复元素的序列减少为一个元素,例如 [2,3,4,1,7,7,7,3,4,1,1,1,3,..] -> [2,3,4,1,7,3,4,1,3 ,..]

所以,我需要一些优雅的功能"f"从 [Int] -> [Int] 执行此操作。 另外,它必须惰性地处理无限列表,所以如果我运行

f values

不能挂起并实时输出数据


您可以与group :: Eq a => [a] -> [[a]] https://hackage.haskell.org/package/base-4.14.1.0/docs/Data-List.html#v:group制作组列表。因此,对于给定的样本数据,这将生成:

Prelude> import Data.List(group)
Prelude Data.List> group [2,3,4,1,7,7,7,3,4,1,1,1,3]
[[2],[3],[4],[1],[7,7,7],[3],[4],[1,1,1],[3]]

然后我们可以为每个子列表只产生第一个元素head,我们知道这样的元素存在,因为否则它永远不会首先构造一个新的组:

Prelude Data.List> map head (group [2,3,4,1,7,7,7,3,4,1,1,1,3])
[2,3,4,1,7,3,4,1,3]

这意味着您可以定义f as:

import Data.List(group)

f :: Eq a => [a] -> [a]
f = map head . group

这也适用于无限列表。例如,如果我们以无限列表结束列表5s,然后它处理列表直到五个并继续寻找新值:

Prelude Data.List> map head (group (2 : 3 : 4 : 1 : 7 : 7 : 7 : 3 : 4 : 1 : 1 : 1 : 3 : repeat 5))
[2,3,4,1,7,3,4,1,3,5

或者我们可以利用group :: (Foldable f, Eq a) => f a -> [NonEmpty a] https://hackage.haskell.org/package/base-4.14.1.0/docs/Data-List-NonEmpty.html#v:group of Data.List.NonEmpty:

import Data.List.NonEmpty(group)
import qualified Data.List.NonEmpty as NE

f :: Eq a => [a] -> [a]
f = map NE.head . group
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

haskell 优雅的方式从无限的数字列表中过滤(减少)重复序列 的相关文章

随机推荐

  • 哈希表 v 自平衡搜索树

    我很想知道使用自平衡树技术来存储项目比使用哈希表更重要的推理是什么 我发现哈希表无法维护插入顺序 但我始终可以在顶部使用链表来存储插入顺序序列 我发现对于少量的值 哈希函数会增加成本 但我总是可以将哈希函数与密钥一起保存以加快查找速度 我知
  • 检测何时将文本输入到文本区域并相应地更改它

    我有一个textarea用户可以在其中输入或粘贴其他人的电子邮件地址 并在按 提交 按钮后向他们发送邀请 每封电子邮件必须用逗号分隔 并且在提交表单之前有效 验证由jQuery 验证插件 http jqueryvalidation org
  • “在‘​​vue’中找不到导出‘默认’(作为‘Vue’导入)

    我是 VueJs 的初学者 这是我的第一个应用程序 import BootstrapVue from bootstrap vue import createApp from vue import App from App vue const
  • “函数”对象没有属性“tk”是什么意思?

    我目前正在开发一个程序 可以让您注册一个帐户 然后通过将详细信息写入 txt 文档并再次读取它们来再次登录 一切都工作正常 直到我添加以下内容 def login fh open usernamepassword txt r lines f
  • 在 Swift 中过滤具有多个条件和类型的对象数组

    我正在尝试在我的应用程序中进行一些复杂的过滤 但我不知道下一步该做什么 我的数据由一个字典数组组成 其中每个字典中的值可以是String Int or String let person1 String Any first name Joh
  • Onload 使输入大小适合文本长度

    我试图让 jQuery 测试 onLoad 输入框中文本的长度 并更改输入框的大小以适应 这是迄今为止我的代码尝试 emailSubject attr size this val length 我收到以下错误 this val 不是函数 我
  • Zend_Validate_Float 语言环境不适用于 hi_IN 语言环境

    在使用 hi IN 进行数字验证时 我面临以下问题 其中 Zend Locale Format isFloat 对于非单个数字和任何语言环境都可以正常工作 但不适用于单位数字和区域设置 hi IN 源代码 测试用例 foreach arra
  • 有没有办法识别 c/c++ 库的版本?

    例如 如何获取 usr lib libz a的版本 如果可以获取其他有用的信息 例如编译器 架构等 那就太好了 我想知道这一点的原因是 当我编译程序并与特定版本的 libz 链接时 gcc 总是说它忽略了我在命令行中提供的 libz gcc
  • 覆盖 require.js 中的 setTimeout

    我们在项目中使用 require js 我们需要重写设置超时时间在第 705 行 这是我们需要的代码以某种方式忽略 省略这个 setTimeout 根本 我的意思是运行它 问题是 如果我在更改版本时显式地在开源代码中更改它 代码将丢失 我应
  • 将数组传递给存储过程

    我必须将数组和字符串传递给存储过程并返回数据表 C side public DataTable fetchRequested string empID string account string refNo string orgID str
  • 可以在 Coq 的蕴涵中使用 destruct 吗?

    destruct可以用来分割and or在柯克 不过好像也可以用暗示 例如我想证明 P gt P Lemma test P P gt P Proof unfold not intro pffpf apply pffpf intro pff
  • 如何自动填写XFA(PDF)表格?

    我正在寻找一个免费选项来填写 XFA PDF 表单 我知道 iText 是一个选择 但它们的商业价格对我来说太贵了 我更喜欢完全开源的东西 有 PDFBox 但它似乎不允许将数据插入 XFA 表单 或者至少很少解释如何插入 我只需要使用文本
  • Python字典查找性能,get vs in

    这并不是过早的优化 我的用例在内部循环的最里面对字典的权利进行了双重检查 一直运行 而且 它在智力上也令人厌烦 见结果 这些方法中哪一种更快 mydict hello yes goodbye no key hello A if key in
  • 对 BigIntegers 列表求和

    我已经查看了所有内容 但无法弄清楚这一点 如何对 BigIntegers 列表求和 Using System Numerics Using System Linq List
  • 具有多个组件的开盖

    我正在尝试将三个单元测试项目 三个不同的 dll 合并到一份 OpenCover 报告中 是否可以 我尝试查看过滤器 但在 OpenCover Wiki 站点中没有看到足够的详细信息 示例 有人可以告诉我可以从哪里开始吗 多谢 对的 这是可
  • 错误:无法初始化客户端 | mongo-connect 快速会话

    我在尝试在 mongodb 上保存会话时遇到错误 这是我的代码 const express require express const session require express session const MongoStore req
  • 与 gfortran 和 gcc 静态链接的混合语言

    我有一些用 C 和 Fortran 编写的代码 我想将其编译成静态链接的可执行文件 如果我动态编译代码 使用 fno underscoringgfortran 的选项 一切正常 但是 我想将其链接到 so文件中 静态链接大部分需要的库 然后
  • 从派生的可变参数模板类调用基模板的虚拟方法

    这本质上是后续之前的一个问题 https stackoverflow com q 26351963 315052 不是我提出的 但我对答案感兴趣 问题是 为什么编译器 链接器无法解析派生类对虚函数的调用 在这种情况下 派生类是具有可变参数的
  • C# 强制执行语句的顺序

    我的问题是关于 C 大概还有 Net 中的执行顺序保证 我给出了我所了解的 Java 示例来进行比较 对于Java 来自 Java并发实践 只要在该线程内无法检测到重新排序 就无法保证一个线程中的操作将按照程序给定的顺序执行 即使重新排序对
  • haskell 优雅的方式从无限的数字列表中过滤(减少)重复序列

    这是一个产生无限随机数列表的函数 import System Random values Int values map fst scanl r gen gt randomR 1 10 gen randomR 1 10 mkStdGen 1