如何填充现有列表/数组

2023-12-04

我是 Reason / ocaml / 函数式编程的新手。

我知道关于List.append and [] @ []但这些函数将创建新列表,但如何填充现有列表/数组?

  1. 填充列表的最佳方法是什么?
  2. 填充数组的最佳方法是什么?表示坐标类型是否为let coords: array point = [];
  3. 或者对于这种情况,这是错误的流程(算法)?

原因代码:

type point = {x: int, y: int};

let coords: list point = [];

let append raw =>
  Array.iter
    (
      fun data => {
        let p = {x: data.x, y: data.y};
        /* how to append p to coords */
        ()
      }
    )
    raw;

JS 类似物:

const coords = [];
const append = raw => raw.forEach({x, y} => {
  coords.push({
    x: process(x),
    y: process(y)
  });
});

欢迎来到理性!

在 Reason/OCaml 中,列表是不可变的。在底层,它们是简单的单链表。每次“修改”它们时都会创建新的。这是一个例子:

let a = [1, 2, 3];
let b = [0, ...a];

这类似于 JavaScript 的数组“spread”,只不过这里你采用的是现有的a,链接一个新节点0在前面,并称其为b。a仍然指向[1, 2, 3](因此“不可变”)。b is now [0, 1, 2, 3]。这是有效的,因为[1, 2, 3]部分是共享的。

这样做的好处是,您不必担心传递列表并意外地让一个不起眼的函数修改它。列表的不变性允许您纯粹通过查看您现在所关注的值来推理您的代码(因为它永远不会改变!)。

列表的缺点是在末尾添加内容效率低下:

let c = a @ [4] 

该操作基本上是获取一个项目的列表,[4],并依次附加每一项[1, 2, 3]到它。就性能而言是线性的。但从列表实现的简单性来看,历史上认为值得进行权衡。

所以 3. 如果您尝试设置列表项,那么这是错误的流程。

  1. 在您的情况下填充列表的最佳方法是从旧列表中以非变异方式映射它:let newList = List.map (fun blabla => ...) raw
  2. 数组也一样。地图覆盖它。有Array.of_list and Array.to_list如果你被困住了。

有关数组的更多信息:OCaml 数组是可变的,并且其大小是不可更改的。将其视为一块内存。您可以通过分配一个新数组Array.make newSize,然后通过填充它Array.set。如果您大量调整数组大小,这就没有意义,因此请选择正确的数据结构。

对于 JS 编译,BuckleScript 将 ocaml 数组编译为 JS 数组。因此它是可变的and可调整大小。您将在下面找到您熟悉的 JS 数组操作Js.Array

作为一般启发式,如果您想更改长度:尝试filter。如果您想更改长度和包含的项目,请尝试fold_left。否则,map.

最近,我们开始实现一些不可变的、可调整大小的、可选可变的数组。敬请关注!

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

如何填充现有列表/数组 的相关文章

  • F# 与 OCaml:堆栈溢出

    我最近发现了一个关于适合 Python 程序员的 F http combiol org fs FSUG FS4PPv2 pptx 看完之后 我决定自己实现一个 蚂蚁谜题 的解决方案 有一只蚂蚁可以在平面网格上走动 蚂蚁一次可以向左 向右 向
  • 如何设置Emacs默认编译目录?

    我正在 Emacs 下编写 OCaml 代码 我有一个makefile在工作文件夹中 以及几个包含以下内容的子文件夹 ml文件 如果我启动M x compile and make在缓冲区上工作正常makefile 但不适用于 a 的缓冲区
  • F# 中的命令式多态性

    OCaml 的 Hindley Milner 类型系统不允许命令式多态性 类似于 System F 除非通过最近对记录类型的扩展 这同样适用于 F 然而 有时需要将用命令式多态性 例如 Coq 编写的程序翻译成此类语言 Coq 的 OCam
  • 让menhir将用户定义的函数从.mly添加到.mli

    Menhir 允许将任意 ocaml 代码添加到 mly 文件的末尾 我想在其中声明一些函数 但我找不到一种方法让 menhir 将我的函数添加到 mli 文件中 以便它们从其他模块中可见 是否可以 答案很简单 那就是no 中定义的代码 m
  • OCaml 中的多态性 - 特别、参数、包含/子类型

    我在理解不同类型的多态性时遇到问题 特别是关于 OCaml 的多态性 我知道多态性允许 OCaml 中表示为 a 的多种类型 但我不明白不同类型的多态性是什么 如果有人能用相对低级的语言给我解释那就太棒了 临时 参数 包含 子类型 这是一个
  • 在 OCaml 中将哈希表转换为对(键,值)列表

    OCaml 中有没有办法将哈希表转换为 键 对 值列表 我知道 给定一个哈希表ht我们可以做的 BatList of enum BatHashtbl enum ht 使用电池库 这会将表转换为枚举 然后将枚举转换为列表 但我正在寻找一种不使
  • OCaml 是否复制了自定义块?

    想象一下 我有一个名为 libcat 的 C 库 用于与我的毛茸茸的猫进行交互 因此 我正在为 OCaml 编写绑定来简化与 fluffy 的交互 module type CAT sig type cat val find gt cat v
  • Ocaml 模块实现

    Ocaml的标准库包含各种模块 List Map Nativeint等等 我知道提供了这些模块的接口 例如 列表模块 http caml inria fr pub docs manual ocaml libref List html 但我对
  • Ocaml,用列表中的给定元素替换所有指定元素

    我正在编写一个 ocaml 项目 其中我有一个函数可以替换所有 在字符列表中 E 这是我的建议代码 let rec string lst change E lst match lst with gt let a E a h t if h g
  • 使用 OCaml Graphics 实际更改文本大小

    我想知道如何在 OCaml 中设置文本大小 我试过Graphics set text size我想这应该可以达成交易 但无论我把set text size 200 or set text size 20并没有改变什么 Graphics se
  • 什么才是真正性能更高的? Haskell 或 OCaml [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 类型变量和局部抽象类型有什么区别?

    我试图理解的目的局部抽象类型在 OCaml 中 局部抽象类型与类型变量有何不同 看来他们有相同的行为 Type variable let f x a a x val f a gt a
  • 将 OCaml 转换为 F#:将 OCaml open_box 和 close_box 转换为 F#

    我正在将几个基于 OCaml 的模块转换为 F 并遇到了 OCaml 打印格式化函数open box 和 close box http caml inria fr pub docs manual ocaml libref Format ht
  • OCaml 中 let rec 的限制

    这几天我在学习OCaml 发现了这个 OCaml 对于可以放在 let 记录右侧的内容有限制 像这个 let memo rec f norec let rec f memoize fun x gt f norec f x in f Erro
  • 使用 OCaml 警告属性禁用警告 8:不详尽的匹配

    我正在尝试编写类似于以下内容的代码 let a b body 1 2 我想仅针对该模式禁用警告 8 a b 而不是为了身体或让之外的任何东西 我尝试设置警告属性来禁用警告 但以下方法都不起作用 let warning 8 a warning
  • OCaml:用消息断言

    又是另一个问题 P 我不太确定是否应该将其发布在这里或 OCaml 邮件列表上 但我首先尝试这样做 我喜欢断言语句 然而 我发现如果没有附加消息 错误消息几乎毫无用处 第 XXX 行的断言冲突 很好 但实际上出了什么问题 我认为断言的一个很
  • 错误:无法安全地评估递归定义模块的定义

    我很想了解为什么会发生此错误以及解决该错误的最佳方法是什么 我有几个文件types ml and types mli它定义了一个变体类型value可以是许多不同的内置 OCaml 类型 float int list map set 等 由于
  • OCaml:如何运行包含库的脚本

    我正在按照 Real World OCaml 一书来学习 OCaml 许多程序都需要使用 Jane Street Core 库 当我在顶层使用这个核心库中的函数时 它工作得很好 在那里 我只需使用以下命令来打开 Core 库 use top
  • OCaml 中的用户定义打印机

    printf fprintf等 全部接受 a转换 手册上说对于 a 用户定义的打印机 采用两个参数 并将第一个参数应用于 outchan 当前输出通道 和第二个参数 因此 第一个参数的类型必须为 out channel gt b gt un
  • OCaml 中的不可变变量

    我正在学习 OCaml 我对变量的不变性有点困惑 根据我正在读的书 变量是不可变的 到目前为止一切顺利 但到底为什么我可以这样做 let foo 42 let foo 4242 我缺少什么 我认为最好的解释方法是举个例子 考虑以下代码 在

随机推荐

  • JSF 2.0视图参数传递对象

    我试图将一个对象从一个页面传递到另一个页面 其中每个页面都位于不同的视图中 在第一页上 我有一个输入文本 其中 myBean 是一个 ViewScoped Bean 名称是一个对象
  • 从基础实体查找属性的使用情况

    我试图在属性属于基类的类中找到该属性的用法 这是一个令牌示例 class Program class Item public DateTime DeletedStamp get set public decimal Price get se
  • 播放下载 URL 中的视频

    我有一个网址 http fitnation theclientdemos com 9000 media uploads videoplayback 3 JtVCHi1 当我在浏览器上运行此 URL 时 我的 VDO 开始下载 请帮助在视图中
  • websphere 中的 Spring commonj.Workmanager

    在websphere中运行spring的workmanager任务执行器时收到异常 以下是我的代码
  • 如何使用 VBA 创建 CurrentDb 的副本

    我需要使用 VBA 创建 CurrentDB 的副本 大约 12 个副本 这些副本需要是主数据库的克隆 其中包含所有相同的表单 查询等 但仅包含有限的数据集 DoCmd CopyDatabaseFile似乎是为此而设计的 但只有在使用它将数
  • 我们是否需要将所有具有不同 dpi 的图像添加到 Android 应用程序中

    如您所知 Android 应用程序具有不同的 DPI 并且在 Android 应用程序中我们可以添加drawable不同 DPI 的情况ldpi mdpi hdpi and xhdpi文件夹 问题是 当我们想要支持所有 DPI 时 我们应该
  • 查找 jasper server-ireport plugin.jar 对 maven 的依赖

    我正在尝试连接到JasperReports服务器从我的 Java 项目获取所有报告的列表 浏览完用户指南后 我发现有一个jasperserver ireport plugin jar其中有很多有用的帮助类 我需要为此获取 Maven 依赖项
  • 当特定幻灯片加载时或在计时器上调用子例程

    我正在使用用于信息亭显示的 PowerPoint 2003 演示文稿 并且它几乎 24 7 都在运行 其中一张幻灯片显示了天气 当前日期和 7 天的天气预报 我已经编写了从 Excel 工作簿更新天气并更新显示日期的子程序 但现在我必须在进
  • Facebook iOS SDK 3.0 无法在 iOS 3.x 上运行吗?

    The Facebook iOS SDK 3 0 Beta 说 这些新功能适用于 iOS 4 0 及更高版本 这是否意味着它不能在 iOS 3 x 上运行 这是否意味着如果我有一个支持 iOS 3 x 的应用程序 我就无法使用 Facebo
  • 同时根据两个参数进行集合排序

    我有一堂有两个日期字段的课程 class TestData Date activation Date timeStamp 我想根据以下内容对上述类别的列表进行排序activation日期 如果它们相等 则基于timestamp即 max a
  • Java 程序告诉您对于从 1 美分到 99 美分的任何金额的找零,要送出哪些硬币

    我必须编写一个 Java 程序 告诉您对于 1 美分到 99 美分之间的任意金额的找零 要发放哪些硬币 例如 如果金额为 86 美分 则输出将类似于以下内容 86 美分可以分为 3 个 25 美分 1 个角硬币和 1 个便士 使用 25 1
  • 实体框架(.NET 完整框架)订购包括[重复]

    这个问题在这里已经有答案了 我正在尝试让以下内容发挥作用 dbmsParentSections FactoryTools Factory PdfSections Include x gt x Children OrderBy y gt y
  • Elastic Search - Spark 中的多个字段作为映射 ID

    我对弹性搜索还很陌生 我在用elasticsearch hadoop 6 2 4版本 我正在读取文件HDFS 转换为bean对象并写入elasticsearch 我正在使用 Spark 结构化流 StreamingQuery query d
  • Ruby on Rails 不使用脚手架和生成器?

    我是 ruby on Rails 的新用户 我有一些问题请尽快给出答案 1 是否可以在不使用的情况下创建Web应用程序 rails新应用程序名称 命令 意味着手动创建所需的文件夹和文件 2 我想在不使用脚手架和生成器的情况下创建应用程序 因
  • 使用java创建XLSX文件后出现错误消息

    我正在使用 apache poi 使 用 java 创建一个简单的 xlsx 文件 如下所示 String date 2014 12 29 XSSFWorkbook w ADPFidessa createExcelWorkbook date
  • 使用 C# Windows 窗体应用程序 (.NET Framework) 进行 Windows Hello 验证?

    我可以编写一个代码块 在单击按钮时打开 Windows Hello 窗口并根据密码的正确性采取操作吗 如果我会写 我会怎样写 我正在研究 Windows Forms NET Framework C 对于 NET Framework WinF
  • 为什么内联 JavaScript 不好?

    始终建议通过将所有代码放在一个文件中来避免内联 Javascript 代码JS文件 该文件包含在所有页面中 我想知道 这是否不会导致大页面的性能问题 例如 假设我们有数十个这样的函数 function function1 element v
  • 旋转画布不应旋转其子画布

    有没有什么方法可以只旋转画布而不旋转它的子元素 如图像 几何图形等 任何人可以提供的任何帮助将不胜感激 非常感谢 拉希什 Kent Boogarts 的建议也是我最初想到的 实施起来并不难 因为可以直接绑定到Inverse画布的变换
  • ARCore – 渲染距相机200m远的物体

    我正在使用 ARCore 和 Sceneform 开发 Android AR 项目 我需要放置物体距离30米到200米来自用户的相机并面对视锥体剔除ArCore 中的问题 已描述HERE 我正在尝试设置投影矩阵增加far使用该方法的参数 p
  • 如何填充现有列表/数组

    我是 Reason ocaml 函数式编程的新手 我知道关于List append and 但这些函数将创建新列表 但如何填充现有列表 数组 填充列表的最佳方法是什么 填充数组的最佳方法是什么 表示坐标类型是否为let coords arr