在 F# 中对平面序列进行惰性分组

2024-01-08

给定一个项目序列如下:

[ ("a", 1); ("a", 2); ("a", 3); ("b", 1); ("c", 2); ("c", 3) ]

我怎样才能将其懒惰地转换为:

{ ("a", { 1; 2; 3}); ("b", { 1 }); ("c", { 2; 3}) }

您可以假设输入数据源已按分组键元素排序,例如“a”、“b”和“c”。

我在那里使用 { } 来指示它是一个延迟评估的项目序列。

我已经让它通过两个 while 循环强制工作,对源序列的 IEnumerator 进行操作,但这涉及创建引用变量和突变等。我确信有更好的方法可以做到这一点,也许使用递归或使用Seq 库中的一些操作,例如扫描还是展开?


如果你想实施这个IEnumerable<'T>(使其变得懒惰),那么它必然会有些势在必行,因为IEnumerator<'T>用于迭代输入的类型是必需的。但其余部分可以使用序列表达式编写为递归函数。

以下在第一级中是惰性的(它惰性地生成每个组),但它不会惰性地生成组的元素(我认为这将具有非常微妙的语义):

/// Group adjacent elements of 'input' according to the 
/// keys produced by the key selector function 'f'
let groupAdjacent f (input:seq<_>) = seq {
  use en = input.GetEnumerator()

  // Iterate over elements and keep the key of the current group
  // together with all the elements belonging to the group so far
  let rec loop key acc = seq { 
    if en.MoveNext() then 
      let nkey = f en.Current 
      if nkey = key then 
        // If the key matches, append to the group so far
        yield! loop key (en.Current::acc)
      else 
        // Otherwise, produce the group collected so far & start a new one
        yield List.rev acc
        yield! loop nkey [en.Current]
    else
      // At the end of the sequence, produce the last group
      yield List.rev acc
  }
  // Start with the first key & first value as the accumulator
  if en.MoveNext() then 
    yield! loop (f en.Current) [en.Current] }

不幸的是,这个(非常有用!)函数不包含在标准 F# 库中,所以如果你想分组adjacent元素(而不是使用列表中的任意元素Seq.groupBy),你必须自己定义它......

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

在 F# 中对平面序列进行惰性分组 的相关文章

  • 搜索深度嵌套数组以更新对象

    我有一个深层嵌套的数据结构 我有兴趣匹配数组 和数组数组 中的某个值 然后将一些数据推送到随附的数组中 例如以下是我的数组colors并伴随着的是更多颜色数组可能存在也可能不存在 var myData color green moreCol
  • Java递归方法求阶乘返回负输出[重复]

    这个问题在这里已经有答案了 我知道这是溢出 但问题是 20 是相对较小的数字 这不应该发生 对吧 有没有更好的方法来查找大数 例如 1000 的阶乘 而不会得到这种奇怪的结果 public class RecursiveFunctionsE
  • 将 F# 类型保存到数据库

    A lot http gorodinski com blog 2013 02 17 domain driven design with fsharp and eventstore f 文章数推荐 http fsharpforfunandpr
  • 线程“main”中的异常 java.lang.StackOverflowError

    我有一段代码 但我无法弄清楚为什么它在线程 main java lang StackOverflowError 中给出异常 这是问题 Given a positive integer n prints out the sum of the
  • 何时评估 F# 函数调用;懒惰地还是立即地?

    F 中的柯里化函数 我知道传入参数子集会产生一个带有预设的函数 我只是想知道传递所有参数是否有什么不同 例如 let addTwo x y x y let incr a addTwo 1 let added addTwo 2 2 incr是
  • @tailrec为什么这个方法不编译为“包含不在尾部位置的递归调用”?

    tailrec private def loop V key String V key match case gt loop key 此方法无法编译并抱怨它 包含不在尾部位置的递归调用 有人可以向我解释一下发生了什么事吗 这个错误消息对我来
  • Python如何处理无限递归?

    因此 在使用 Python 时 我注意到程序的堆栈大小基本上没有限制 继续对数字执行幂运算 即使在达到数千位之后 精度仍然保持完美 这让我想知道 如果我不小心进入了Python的无限递归循环怎么办 编译器会注意到并抛出堆栈溢出错误吗 或者程
  • 如何使 FSI 在 NET5 下工作并让愚蠢的 stackoverflow 消息“标题不能包含...”闭嘴?

    我正在将一个相当小的 F 项目从 Net Framework 迁移到 NET5 迁移非常简单 一切正常 包括测试 但是 当我运行一些脚本时 我现在收到以下错误 Microsoft R F Interactive version 11 0 0
  • 仅使用堆区域的递归

    是否有仅使用堆区域的递归示例 在 C 中 基于函数调用的递归总是使用堆栈 几乎按照定义 如果您愿意将递归转换为迭代 那么可以仅使用堆空间 但这并不是真正的递归 您可以通过在堆中实现堆栈来实现这一点 某些问题可以使用尾递归 http en w
  • 理解基本递归

    public static void main String args System out println factorial 5 public int factorial int n if n lt 1 return 1 else re
  • F# 和 MEF:导出函数

    因此 我试图在 F 控制台应用程序中运行这个简单的测试 open System Reflection open System ComponentModel Composition open System ComponentModel Com
  • 像 Javascript 对象一样循环遍历 F# 记录

    在 javascript 中 我可以使用简单的 for 循环访问对象的每个属性 如下所示 var myObj x 1 y 2 var i sum 0 for i in myObj sum sum myObj i 我想知道我是否可以用 F 做
  • 递归树遍历 - 如何跟踪递归级别?

    我基本上试图从表示树结构的多维数组构建 html ul li 嵌套列表 下面的代码工作正常 但我想改进它 我需要一种方法来跟踪递归级别 以便我可以将不同的类应用于不同的级别 向生成的输出添加缩进等 function buildTree tr
  • 递归分割列表函数 LISP

    split list 函数接受一个列表并返回一个由两个列表组成的列表 其中两个列表由输入的交替元素组成 我写了以下内容 defun split list L cond endp L list NIL NIL t let X split li
  • F# 中的自定义路由事件

    我正在尝试翻译这段 C 代码 https msdn microsoft com en us library ms752288 aspx 到目前为止我的尝试 type MyButtonSimple as self inherit Button
  • Javascript 中的深平面多维数组[重复]

    这个问题在这里已经有答案了 我想编写一个可以深度展平给定数组的函数 例如 deepFlatten deepFlatten 1 2 3 1 2 3 deepFlatten 1 2 3 a b c 1 2 3 1 2 3 a b c 1 2 3
  • Python脚本递归重命名文件夹和子文件夹中的所有文件

    您好 我有许多不同的文件需要重命名为其他文件 我已经走到这一步了 但我想要拥有它 这样我就可以有许多要替换的项目及其相应的替换项 而不是逐一输入 运行代码然后再次重新输入 更新 另外 我需要重命名以仅更改文件的一部分而不是整个文件 因此如果
  • 从函数返回随机值是副作用吗?

    我当时正在编写一些 F 代码 并且正在编写一个从一组字符串中返回随机字符串的函数 假设我有这样的事情 open System let a a b c d let rstring arr string let r new Random arr
  • 多维数组中的数组排列保留键 PHP

    这两天我一直在疯狂地尝试完成这个任务 也许你可以启发我 这是针对赛马投注排列的 每次用户玩游戏时 我都会得到一个多维数组 2 个级别 第一级包含比赛 ID 第二级包含用户为该比赛选择的马匹 它看起来像这样 play array 4 gt a
  • Fortran 递归分段错误

    我必须设计并实现一个 Fortran 例程来确定方格上簇的大小 并且递归地编写子例程似乎非常方便 然而 每当我的晶格大小超过某个值 大约 200 边 时 子例程就会始终出现段错误 这是我的集群检测例程 RECURSIVE SUBROUTIN

随机推荐

  • WPF 按钮图像仅显示在最后一个控件中

    我对 WPF 相当陌生 可能缺少一些简单的东西 如果我有 3 个控件 则只有最后一个控件会显示我指定的 OriginalImage 非常感激任何的帮助 谢谢 瑞安 主窗口
  • 来自 HttpClient 的重复请求

    我在 android 上使用 HttpClient 4 0 1 我发出一个 POST 请求 其标头集是当前的毫秒数 我看到该请求在彼此间隔几毫秒 5 10 的时间内两次命中服务器 但是我为两个请求设置的标头是相同的 这种情况偶尔会发生 我认
  • SQL 结果作为 PHP 数组

    如何获取包含多行到数组中的 SQL 结果 SQL 表示例 ID Cat LineID Qty DealID Cost 1 Phone 1 2 8941 25 00 2 Phone 2 43 8941 85 00 3 Net 1 2 8941
  • 校对强度和本地语言关系

    我已从 Collat or 的 Javadoc 中阅读了以下内容 对语言功能的优势的准确分配取决于区域设置 例如 在捷克语中 e 和 f 被认为是主要差异 而 e 和 是次要差异 e 和 E 是三级差异 e 和 e 是相同的 这是否意味着我
  • 在 Javascript 中编写部分复制对象的优雅方法?

    我有一个代表表单字段的 javascript 对象 其中大约 70 的字段必须复制到某些对象中才能发送到服务器 其他字段用于 UI 使用 目前 我通过手动为每个字段创建分配来克隆对象 这会导致结构不太好 如下所示 请注意 我将使要复制的部分
  • Symfony Cache 学说/orm/Proxies 无法在第 209 行打开流 /Proxy/AbstractProxyFactory.php

    我正在尝试将 symfony 移动到共享主机 我将 symfony 结构移至 我的 Web 文件夹是 public html 警告 require home user app cache prod doctrine orm Proxies
  • 使用 pytest --collect-only 仅返回单个测试名称

    我正在尝试弄清楚如何使用 pytest 从测试文件中获取测试名称列表 到目前为止我已经做到了 pytest collect only my test file py test session starts platform darwin P
  • 将两字节位掩码转换为 EnumSet

    我正在读取一个二进制文件 该文件的值存储在位掩码中 均为 1 字节位掩码和 2 字节位掩码 掩码中的每一位都充当一个开关 指示事件发生的位置 1 字节掩码示例 00000101 表示事件一和事件 3已经发生了 的例子Enum public
  • 确定该函数内的函数名称

    如何获取该非匿名函数中的函数名称 下面我假设有一个函数或进程可以执行此操作 称为magical r function 以及预期的产出是什么 my fun lt function magical r function my fun 1 my
  • JPA/EclipseLink 未返回结果

    我是 Java 和 JPA 新手 我正在尝试连接到数据库并从表中返回一些结果 但是当我运行查询时 即使该表有超过 100 000 行 我也会得到一个空列表 这是我的 persistence xml
  • 什么是 Java 混合 - Applet + 应用程序?

    我怎样才能写一个呢 从评论到我的reply https stackoverflow com a 12447764 166390 接下来是 我们过去拥有的东西 小程序和应用程序 现在已经不可用了 并反驳 垃圾 它 Applet 和应用程序 被
  • 自定义属性在编译时执行

    我正在尝试创建一个自定义属性 该属性将以某种 AOP 方式工作 不幸的是 我无法访问 postsharp 而且我对 Unity 也不是很熟悉 它有 AttributeUsage Method 并在其构造函数中配置测试环境的某些部分 从 ap
  • 将参数从脚本传递给 gulp 任务

    I have package json具有以下结构的脚本 scripts watch build tsc watch watch server nodemon src app js watch app build tsc gulp do s
  • 列出 mysql 中同一个表的结果

    我如何列出此表中性别 男性且int 女性的iduser Table usermeta id iduser a b 12 204 age 19 7 203 age 35 6 200 age 24 3 201 age 34 5 201 gend
  • Delphi Soap https认证失败弹出对话框

    我们有一个使用 SOAP THTTPRIO 等 通信的 delphi XE 应用程序 默认情况下 该应用程序 在 delphi 中 通过 WinInet dll 工作 我们修复了身份验证代码 使其可以使用 https 身份验证 并且当 ht
  • 在表内搜索记录类型

    我有以下类型 CREATE OR REPLACE TYPE CLONE PRODUCT CHAR RECORD IS OBJECT CharacteristicID NUMBER NewValue VARCHAR2 200 Char New
  • 如何回滚分布式事务?

    我有三个不同的 Spring boot 项目 它们具有独立的数据库 例如 account rest payment rest gateway rest account rest 创建一个新帐户 payment rest 创建一个新的付款 g
  • 使用 gettext 对我有何帮助?

    我正在尝试建立一种方法来允许成员将字符串翻译成其他语言 您可以在此处查看示例 翻译测试 http acs graphicsmayhem com test3 index php 有人建议我为此使用 php 的本机 gettext 函数 而不是
  • 我如何知道我的字符串包含变音符号?

    例如 text eskoslovensk obchodn banka text string contains diacritics like etc 我想编写一个函数 在其中传递此字符串 eskoslovensk obchodn bank
  • 在 F# 中对平面序列进行惰性分组

    给定一个项目序列如下 a 1 a 2 a 3 b 1 c 2 c 3 我怎样才能将其懒惰地转换为 a 1 2 3 b 1 c 2 3 您可以假设输入数据源已按分组键元素排序 例如 a b 和 c 我在那里使用 来指示它是一个延迟评估的项目序