根据谓词将列表拆分为列表列表

2023-11-23

(我知道这个问题,但它与序列有关,这不是我的问题)

给定此输入(例如):

let testlist = 
    [  
       "*text1";
       "*text2";
       "text3";
       "text4";
       "*text5";
       "*text6";
       "*text7"
    ]

let pred (s:string) = s.StartsWith("*")

我希望能够致电MyFunc pred testlist并得到这个输出:

[
    ["*text1";"*text2"];
    ["*text5";"*text6";"*text7"]
]

这是我当前的解决方案,但我不太喜欢嵌套的 List.revs (忽略它以 Seq 作为输入的事实)

let shunt pred sq =
    let shunter (prevpick, acc) (pick, a) = 
        match pick, prevpick with
        | (true, true)  -> (true, (a :: (List.hd acc)) :: (List.tl acc))
        | (false, _)    -> (false, acc)
        | (true, _)     -> (true, [a] :: acc)

    sq 
        |> Seq.map (fun a -> (pred a, a))
        |> Seq.fold shunter (false, []) 
        |> snd
        |> List.map List.rev
        |> List.rev

有一个List.partitionF# 核心库中的函数(如果您只想实现它只是为了让它工作,而不是学习如何自己编写递归函数)。使用这个函数,你可以这样写:

> testlist |> List.partition (fun s -> s.StartsWith("*"))
val it : string list * string list =
  (["*text1"; "*text2"; "*text5"; "*text6"; "*text7"], ["text3"; "text4"])

请注意,此函数返回一个元组而不是返回列表的列表。这与您想要的有点不同,但如果谓词仅返回 true 或 false,那么这更有意义。

实施partition返回元组的函数也更简单一些,因此它对于学习目的可能有用:

let partition pred list = 
  // Helper function, which keeps results collected so
  // far in 'accumulator' arguments outTrue and outFalse
  let rec partitionAux list outTrue outFalse =
    match list with 
    | [] -> 
        // We need to reverse the results (as we collected
        // them in the opposite order!)
        List.rev outTrue, List.rev outFalse
    // Append element to one of the lists, depending on 'pred'
    | x::xs when pred x -> partitionAux xs (x::outTrue) outFalse
    | x::xs -> partitionAux xs outTrue (x::outFalse)

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

根据谓词将列表拆分为列表列表 的相关文章

  • F# 中序列的递归函数

    这是一个相当微不足道的问题 但快速的谷歌搜索并没有给我答案 为序列编写递归函数的标准方法是什么 对于列表 您可以使用空列表和头 尾模式进行模式匹配 序列的等效项是什么 没有标准的方法可以做到这一点 因为您很少为序列编写递归函数 您应该查看各
  • 如何更改 Rx Builder 实现来修复堆栈溢出异常?

    我正在尝试提出一个 Rx Builder 以在 F 计算表达式语法中使用反应式扩展 我该如何修复它 以免堆栈崩溃 就像下面的 Seq 例子一样 是否有计划提供 RxBuilder 的实现作为响应式扩展的一部分或作为 NET Framewor
  • 我缺少什么:可以使用多个参数进行函数组合吗?

    我了解 F 中函数组合的基础知识 例如所述here http blogs msdn com b chrsmith archive 2008 06 14 function composition aspx 不过 也许我错过了一些东西 这 gt
  • 如何在插件场景中实现程序集绑定重定向?

    我有一个plugin P延伸和application A NET40 我无法控制 P 程序集 NET40 有一个shared dependency D NET35 P和D都依赖于FSharp Core 但版本不同 P是针对FSharp Co
  • 在 F# 中“合并”受歧视的联合?

    继从这个问题 https stackoverflow com questions 53506325 result vs raise in f async 我在组合不同类型时遇到问题Result类型在一起 以下是一个人为的示例 不是真实的代码
  • F# 对于 OO 或命令式来说缺少什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 当两个模式共享“when”子句时,模式匹配不完整

    A 共同的惊喜 https stackoverflow com q 18691622 2314532对于 F 初学者来说 以下事实是不完全匹配 let x y 5 10 match something with when x lt y gt
  • 将 C# 代码转换为 F#(if 语句)

    我想知道如何转换此代码逐行从 C 到 F 我不想使用任何类型的 F 习惯用法或类似的东西 我想了解如何直接映射C 的构造到 F 这是 C 代码 requires l Length gt 0 int GetMinimumValue List
  • “不等于”的 F# 语法是什么?

    在 C 代码中 它会是这样的 if c 0 some code 那么在 F 中呢 From MSDN 有关 F 算术运算符的页面 http msdn microsoft com en us library dd469493 aspx 看起来
  • F# 检查列表是否为空

    作为 F 新手 我正在尝试实现一个简单的函数 该函数将索引和列表作为参数 然后返回给定索引的列表值 let rec getElementAtIndex index int list a list match index list with
  • 何时评估 F# 函数调用;懒惰地还是立即地?

    F 中的柯里化函数 我知道传入参数子集会产生一个带有预设的函数 我只是想知道传递所有参数是否有什么不同 例如 let addTwo x y x y let incr a addTwo 1 let added addTwo 2 2 incr是
  • F# 尝试处理未处理的异常

    在下面的代码中 我想读取一个文件并返回所有行 如果存在 IO 错误 我希望程序退出并将错误消息打印到控制台 但程序仍然遇到未处理的异常 对此的最佳实践是什么 我想我不需要Some None因为无论如何我都希望程序在错误时退出 谢谢 let
  • 将事件绑定到 ItemsControl 中的按钮

    我有一个 Windows Phone 7 应用程序 其中包含一些 xaml 如下所示
  • 如何编写一个计算表达式生成器来累积值并允许标准语言构造?

    我有一个计算表达式生成器 可以随时生成值 并且有许多自定义操作 但是 它不允许标准 F 语言构造 并且我在弄清楚如何添加此支持方面遇到了很多麻烦 举一个独立的例子 下面是一个非常简单且毫无意义的构建 F 列表的计算表达式 type Item
  • 如何解决 FParsec 错误“组合器‘许多’已应用于解析器,该解析器在不消耗...的情况下成功”

    我有一个看起来足够简单的解析器 我将此子解析器添加到末尾以提供有关一般解析错误的信息 因为所有其他子解析器都失败了 Read the rest of a line as an error let readError parse let re
  • F# 引用的另一个限制?

    今天早些时候 我遇到了 F 引用的限制 并在这里提出了一个问题 F 引号 变量可能会转义作用域 https stackoverflow com questions 6414185 f quotations variable may esca
  • F# 使用 while 循环

    我有一个数据读取器 我想从中返回行集合 在阅读了一天的书籍后 我无法找到在 f 中执行此操作的最佳方法 我可以在 F 中以正常的 C 方式进行操作 但这不是我使用 f 的原因 这就是我想要实现的目标 let values while rea
  • 如何在 F# 中进行卷积?

    我想convolve http en wikipedia org wiki Convolution具有离散滤波器的离散信号 信号和滤波器是 F 中的浮点数序列 我能弄清楚如何做到这一点的唯一方法是使用两个嵌套的 for 循环和一个可变数组来
  • 从函数返回随机值是副作用吗?

    我当时正在编写一些 F 代码 并且正在编写一个从一组字符串中返回随机字符串的函数 假设我有这样的事情 open System let a a b c d let rstring arr string let r new Random arr
  • 如何从 f# 返回一个空元组到 c#? [复制]

    这个问题在这里已经有答案了 我有这个类型正确的 C 函数 static System Tuple

随机推荐

  • Spring Boot应用程序启动后立即关闭

    我目前正在开发一个包含 Spring 框架的项目 一切都按方面进行 但有一个问题 当我尝试在笔记本电脑上启动应用程序时 它在启动后立即关闭 它在其他所有机器上都可以工作 所以这个问题只发生在我的笔记本电脑上 也许您知道什么会导致这个问题 我
  • 如何重新安装已安装的 Eclipse 插件?

    如何将 Eclipse 插件从一个 Eclipse 安装 删除 或 复制 到另一个安装 例如 我安装了两个 eclipse 其中一个安装了一个插件 但我没有安装程序 也不容易在线获得 是否可以在我的其他版本的 eclipse 上安装此插件
  • 在浏览器中显示word/pdf/excel等文件。 (ASP.NET、C#.NET 2008)

    我有一个需要在浏览器中显示 Pdf Word 文档 任何版本 或 Excel 的要求 类似于GMAIL的功能 我怎样才能实现这个目标 我正在使用 Asp net 代码隐藏为 C 申请时间是2008年 Try 如何使用 ASP NET 和 V
  • 如何在使用相对 URL 时更改 http/https 协议

    协议相关 URLaren t我在寻找什么 我正在寻找一种绝对指定协议 http 与 https 同时保持 url 相对主机名的方法 给定一个相对 URL 例如 SearchForStuff 我希望能够指定不同的协议 https 与 http
  • 如何在 Linux 上使用 GCC 编译 C 和 Gtk+?

    我搜索了又搜索 但没有得到我真正想要的信息 有人可以尽可能完整地 从根本上解释一下在 Linux 上使用 GCC 用 C 语言编写时 Gtk 代码是如何编译的吗 有些东西像反引号 c99 和 o 文件我根本不理解 我也非常感谢任何学习 Gt
  • RealityKit - 为 ModelEntity 的不透明度设置动画?

    通过设置材质的颜色model的财产ModelEntity 我可以改变对象的不透明度 alpha 但如何将其动画化呢 我的目标是使对象具有完全不透明度的动画 然后让它们淡入设定的不透明度 例如 50 With SCNAction fadeOp
  • R 中 igraph 网络的输出 shapefile

    你好 我在 R 中有一个使用 igraph 库的网络 Vertices 616 Edges 6270 Directed TRUE No graph attributes Vertex attributes name Lat Lon Edge
  • 为什么 JavaScript 中的匿名函数有名字?

    我正在读一本很棒的书 名为 JavaScript Ninja 的秘密 作者是 John Resig 和 Bear Bibeaoult 3 2章中给出了一个例子 var canFly function return true 然后它说 创建一
  • 按创建顺序对哈希表进行排序

    这类似于如何保持哈希表中元素的顺序 NET 除外 有没有Hashtable or Dictionary在 NET 中 允许您访问它的 Index条目的属性是否按照添加到集合中的顺序排列 A NameValueCollection可以通过索引
  • 如何在 sails.js 中获取当前域名地址

    我试图使用获取当前网址sails js 我尝试了以下方法 req param host and req param X Forwarded Protocol 返回未定义 req headers host 返回本地主机 但我的域不是本地主机
  • 如何获取管道中第一个命令的退出状态? [复制]

    这个问题在这里已经有答案了 我做了一个简单的脚本 more test bash bin bash echo test exit 1 当我运行脚本时 退出状态应该是1 tmp test bash echo 1 但是当我按以下方式运行时 tmp
  • 如何找出我的代码在哪里导致 GLib-GObject-CRITICAL?

    当 C C 应用程序失败并出现以下 CRITICAL 错误时 您能否告诉我如何找出导致错误的代码在哪里 我尝试在调试器中运行它 尝试在程序失败时执行 bt 但它没有显示导致关键问题的代码在哪里 process 3155 GLib GObje
  • 在 python 中,我可以将 print 函数的输出重定向到 stderr 吗?

    有很多print功能 python 2 7 在我的程序中 有什么方法可以添加几行然后所有输出都可以重定向到stderr 我想要的是 python 代码 而不是 linux 管道 例如我的程序是这样的 print hello world 我想
  • Python:在单词边界上分割unicode字符串

    我需要获取一个字符串 并将其缩短为 140 个字符 目前我正在做 if len tweet gt 140 tweet re sub r s tweet normalize space footer utils shorten urls po
  • MOVDQA 和 MOVNTDQA 以及 WB/WC 标记区域的 VMOVDQA 和 VMOVNTDQ 有什么区别?

    通过使用标记为 WB 回写 和 WC 写组合 的内存的指令之间的主要区别是什么 MOVDQA and MOVNTDQA 以及之间有什么不同VMOVDQA and VMOVNTDQ 是不是 内存已标记为 WC 指令 NT 与平常没有什么不同
  • 如何使用 git init 将本地 git hook 替换为更新版本?

    我和这位用户有完全相同的问题 git init 模板 替换修改后的钩子 我的全局 git hooks 中有一个新的模板文件 但是 原来的模板文件已经加载了 所以git init不会覆盖 我在这里读到了同样的内容 这似乎是正确的 git 行为
  • 使用moment.js,如何向用户显示当前的日期格式?

    给定一个文本字段 我想要一个合适的占位符 典型的占位符类似于 mm dd yyyy 但是 我想通过 moment js 使用区域设置感知日期 这意味着我将指定 l 作为 moment js 日期格式 如何确定在这种情况下 moment js
  • 如何使用 pandas 更改数据框中文本的字体大小

    我研究了 pandas 的样式文档 但无法准确地得到我的问题的特定和准确的答案 我正在使用数据帧读取 Excel 文件并在程序中处理该数据帧 最后 我使用 xlwings 库在另一个现有的 Excel 文件中写入处理后的数据帧 我在用 im
  • 如何使编辑器句柄可选择以显示属性检查器窗口

    这是来自的后续问题如何使贝塞尔曲线的各个锚点连续或不连续 请参阅它以获取已接受答案中的相关代码 请注意 我这样做是为了保持这个问题的简洁 因为相关代码相当冗长 我正在努力实现以下目标 使贝塞尔曲线手柄 控制点可选择 以便在选择时单个手柄的属
  • 根据谓词将列表拆分为列表列表

    我知道这个问题 但它与序列有关 这不是我的问题 给定此输入 例如 let testlist text1 text2 text3 text4 text5 text6 text7 let pred s string s StartsWith 我