替换列表元素是反模式吗?

2024-02-17

我有一个适用于以列表表示的路径的模块。大多数函数都会执行典型的递归列表处理,但现在我需要一个有时会改变路径的函数。所以,我写了这个replace功能:

module List =
  let replace f sub xs = 
    let rec finish acc = function
      | [] -> acc
      | x::xs -> finish (x::acc) xs
    let rec search acc = function
      | [] -> None
      | x::xs -> 
        if f x then Some(finish ((sub x)::xs) acc)
        else search (x::acc) xs
    search [] xs

其工作原理如下:

let xs = List.init 10 id
let res = List.replace ((=) 5) (fun _ -> -1) xs
//Some [0; 1; 2; 3; 4; -1; 6; 7; 8; 9]

通常,当我觉得需要增强内置模块时,我最终会发现我正在做一些奇怪或低效的事情。替换列表元素是其中之一吗?有没有更简单(同样有效)的方法来做到这一点?


If O(N)您的应用程序的复杂性是可以接受的,您的代码是完美的。为了获得更好的复杂性,您可能希望解决线性搜索的需要,例如通过对元素施加顺序并使用二叉​​搜索树。

不涉及搜索的一个相关问题是用已知索引替换列表元素:

val replaceAt : int -> 'a -> 'a list -> 'a list

对于这个问题,存在比标准列表更好的持久数据结构。在文献中搜索纯功能随机访问列表。

奇怪的是,没有 ML 系列语言(OCaml、F#、SML)定义replace or replaceAt在标准列表库中。这可能是为了鼓励用户重新设计他们的代码以避免O(N)这些操作的复杂性。

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

替换列表元素是反模式吗? 的相关文章

  • 得到“致命错误:索引超出范围”:在 swiftui 的列表项中显示索引

    更新 错误 类型 没有成员 1 如果在list foreach中放置一个if闭包 if self showMarkedOnly name marked 为什么 代码版本4 struct Name Identifiable Hashable
  • 如何在循环列表本身时删除列表元素而不重复它

    我在这个 Python for 语句中浪费了一点时间 class MyListContainer def init self self list def purge self for object in self list if objec
  • Prolog 列表列表获取所有元素

    我有一个列表列表 decide 1 2 3 2 3 6 4 K 我想按 返回所有可能的解决方案 规则是首先返回其列表大小为 1 的值 然后我想返回其大小大于1的值 size 0 size Xs L size Xs N L is N 1 he
  • 对于每个抛出异常的语句,try/catch 是否被视为反模式?

    我目前正在审查同事的 Java 代码 我看到很多情况下 每个可能抛出异常的语句都被封装在自己的 try catch 中 其中 catch 块都执行相同的操作 哪个操作与我的问题无关 对我来说 这似乎是一种代码味道 我记得读到过它是一种常见的
  • 如何将列表 插入数据库

    我是 Java 新手 我已经创建了产品类型的通用列表 如何将其添加到数据库中 该列表包含Products的对象 数据库中的列是Products类的字段 即使我通过 listvariable get 0 等分隔列表 我也会得到对象 而不是该对
  • F# 方法返回 null 而不是 Option

    我开发F 应用 net 4 6 1 on VS2015 我有方法 type CommonHelper static member SideEffectOnNull act x if x null then act x else x stat
  • 排序后的ArrayList不显示?

    ArrayList
  • WriteLine 与类

    我正在制作一个 SchoolApp 程序来学习 C 并且我正在尝试实现以下主要功能 namespace SchoolApp class Program public static void Main string args School s
  • 向 python 元组添加条目

    我有一个代表 x y 点的元组列表 我还有每个点的值列表 如何将它们组合成列表列表 即每个点 x y val 一个条目 或元组列表 Thanks 您无法向元组添加条目 因为元组是不可变的 但您可以创建一个新的列表列表 new x y val
  • C#动态创建Type数组

    在 C 中 我需要能够在运行时基于以字符串形式传递给函数的逗号分隔数据类型列表创建 Type 对象数组 基本上 这就是我想要实现的目标 create array of types Type paramTypes typeof uint ty
  • 对自身内部列表的递归引用[重复]

    这个问题在这里已经有答案了 所以我在 python 中遇到了一些非常奇怪的东西 我尝试添加对列表本身的引用 该代码可能有助于比我能表达的更好地展示我所说的内容 我正在使用 IDLE 编辑器 交互模式 gt gt gt l 1 2 3 gt
  • 将2个暗淡数组“列表列表”输出到python中的文本文件

    简单的问题 我正在创建一个两个暗淡的数组 ddist 0 d for in 0 d 在下面的代码中使用列表 它使用 gis 数据输出距离 我只是想要一种简单的方法来获取数组 列表的结果并将其输出到保持相同的 N N 结构的文本文件 我过去曾
  • 如何向列表添加值>

    我需要将派生类的元素添加到抽象类的共享指针列表中 我一直在尝试这个 我知道我正在尝试在下面的示例中创建抽象类的实例 但我不知道如何使其工作 简化的类如下所示 using namespace std class Abstract public
  • 在 Python 中获取数组作为 GET 查询参数

    我知道在 php 中我可以使用 GET key1 key2 检索以数组形式发送的 GET 数据 但这在 Python 中是可能的 因为我只收到一个字符串 但它不被识别为数组 列表 如果重要的话我使用flask werkzeug 参数名称的深
  • 在 R 中垂直绘制表 kable::extra 和 kable 的列表?

    我需要绘制表格列表一个在另一个之下 显示垂直 有任何想法吗 问题从这里开始 https stackoverflow com questions 73867229 plot a list of tables in a single table
  • 是否可以在 F# 类型提供程序中使用 System.Type 作为静态参数?

    我想知道是否可以使用 System Type 作为 F 类型提供程序中的静态参数 以便我可以编写如下内容 type HelperType HelperProvider
  • 如何访问数据框中的一行嵌套字典

    我有一个 json 文件 如下所示 file name main question no Q 1 question what is answer user John comment It is defined as value number
  • Python列表内存存储[重复]

    这个问题在这里已经有答案了 据我了解 Python 列表本质上是 C 数组 它们分配特定的顺序内存块 但是 这些内存块实际上存储列表中的数据还是它们只是指向内存中存储实际数据的另一个位置 它可能取决于列表中存储的对象的大小吗 因为您可以轻松
  • 查找字典中列表的最大值

    我有一个字典 每个键后面都有一个存储的列表 看起来像这样 dict with values u New York u New York u NY datetime datetime 2014 8 13 0 0 10 u New York u
  • 如何向 F# 项目添加第三方 dll 引用?

    我正在向我的 F 项目添加第三方 dll 引用 我在引用中添加了 dll 当我使用它时 即突出显示代码并执行 Alt Ent 我收到错误 命名空间或模块 AZROLESLib 未定义 我是不是错过了什么 简而言之 你必须使用 r path

随机推荐