将“列表”转换为“集合”?

2024-05-15

OCaml 真的没有从列表转换为集合的函数吗?

如果是这样的话,是否可以制作一个通用函数list_to_set?我尝试制作一个多态集,但没有成功。


基本问题:列表可以包含任何类型的元素。集合(假设你的意思是Set http://caml.inria.fr/pub/docs/manual-ocaml/libref/Set.html标准库的模块),相反,依靠元素比较操作来保持平衡树。你不能指望将一个t list到一个集合,如果你没有比较操作t.

实际问题:Set标准库的模块是函式化的:它作为输入module表示您的元素类型及其比较操作,并生成输出 amodule代表集合。使用列表的简单参数多态性来实现这一点有点运动。

为此,最简单的方法是将 set_of_list 函数包装在函子中,以便它本身由比较函数参数化。

module SetOfList (E : Set.OrderedType) = struct
  module S = Set.Make(E)
  let set_of_list li =
    List.fold_left (fun set elem -> S.add elem set) S.empty li
end

然后,您可以使用 String 模块,它提供了合适的compare功能。

  module SoL = SetOfList(String);;
  SoL.S.cardinal (SoL.set_of_list ["foo"; "bar"; "baz"]);; (* returns 3 *)

还可以使用非函子化集的不同实现,例如电池和 Extlib“PSet”实现(文档 http://ocaml-batteries-team.github.com/batteries-included/hdoc/BatSet.html#6_Polymorphicsets)。建议使用函子化设计,因为它具有更好的类型保证——您不能使用不同的比较操作来混合相同元素类型的集合。

注意:当然,如果你already有一个给定的 set 模块,从 Set.Make 函子实例化,你不需要所有这些;但你的转换函数不会是多态的。例如假设我有StringSet我的代码中定义的模块:

module StringSet = Set.Make(String)

然后我可以写stringset_of_list轻松地,使用StringSet.add and StringSet.empty:

let stringset_of_list li =
  List.fold_left (fun set elem -> StringSet.add elem set) StringSet.empty li

如果您不熟悉折叠,这里有一个直接的、非尾递归的递归版本:

let rec stringset_of_list = function
  | [] -> StringSet.empty
  | hd::tl -> StringSet.add hd (stringset_of_list tl)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将“列表”转换为“集合”? 的相关文章

  • 如何将模块与 js_of_ocaml 一起使用?

    我目前正在开发一个用 OCaml 编写并使用 js of ocaml 编译为 javascript 的网站项目 只要我使用该命令只有一个源文件 它就可以很好地工作ocamlfind ocamlc package js of ocaml pa
  • 类型注释被推断的表达式类型覆盖

    在 Scala 编程语言中 假设我将使用更广泛的类型注释表达式并提供一个狭窄的值 我的程序将被拒绝 scala gt def x A A 8
  • OCaml 是否复制了自定义块?

    想象一下 我有一个名为 libcat 的 C 库 用于与我的毛茸茸的猫进行交互 因此 我正在为 OCaml 编写绑定来简化与 fluffy 的交互 module type CAT sig type cat val find gt cat v
  • Ocaml,用列表中的给定元素替换所有指定元素

    我正在编写一个 ocaml 项目 其中我有一个函数可以替换所有 在字符列表中 E 这是我的建议代码 let rec string lst change E lst match lst with gt let a E a h t if h g
  • 如何从ocaml列表中获取子列表

    我正在查看列表文档 图书馆好像没有提供sublist功能 我正在尝试从中获取元素列表i to j 现在我必须把它写成 let rec sublist list i j if i gt j then else List nth list i
  • OCaml 数据类型定义中的方括号“[”和“]”是什么意思?

    I saw 下列 https coq github io doc v8 11 api coq Genarg index html type rlevel type rlevel rlevel 但我以前从未见过这种情况 并且 ADT 代数数据
  • Ocaml 中的 Socket onread、onready、onclose 事件处理函数

    我正在 Ocaml 中使用 TCP IP 套接字开发协议 并且我有兴趣实现事件驱动方法 基本上 我想创建事件处理函数 每当套接字接收到新数据或关闭或打开时调用 是否可以在 Ocaml 中完成而无需使用多线程手动实现 Thanks 是的 制作
  • 类型变量和局部抽象类型有什么区别?

    我试图理解的目的局部抽象类型在 OCaml 中 局部抽象类型与类型变量有何不同 看来他们有相同的行为 Type variable let f x a a x val f a gt a
  • 错误:无法安全地评估递归定义模块的定义

    我很想了解为什么会发生此错误以及解决该错误的最佳方法是什么 我有几个文件types ml and types mli它定义了一个变体类型value可以是许多不同的内置 OCaml 类型 float int list map set 等 由于
  • 值的 Ocaml 表示 - 原子

    我查看了一些 OCaml 值的内部表示 空数组的表示是atom 0 即一个块tag 0 and size 0 空浮点数数组由atom 0 too 是否存在由原子表示的任何 OCaml 值tag gt 0 如果不是 OCaml 字节码集包含以
  • OCaml:如何运行包含库的脚本

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

    Rust http www rust lang org 有一个线性类型系统 有什么 好的 方法可以在 OCaml 中模拟这个吗 例如 当使用 ocaml lua 时 我想确保仅当 Lua 处于特定状态 堆栈顶部的表等 时才调用某些函数 Ed
  • OCaml 中类型和模块相等的规则是什么

    我无法理解 OCaml 中模块的平等性 函子应该是适用的 这就是互联网所声称的 但这有时似乎会失败 而且我不太明白其背后的一般规则 这是我的示例代码 module type PT sig end module P struct end le
  • OCaml:为什么重命名类型会失败并显示“它们的种类不同”

    我正在为成对的类型见证和见证类型的值构建一个通用容器 我想将其用于几种不同的类型 这会给我带来错误 因为这些类型的名称都相同 所以我尝试重命名函子结果中的类型 如下所示 module type Witness sig type a key
  • OCaml 文字负数?

    我在学 这是我觉得奇怪的事情 let test treeways x match x with when x lt 0 gt 1 when x gt 0 gt 1 gt 0 如果我这样称呼它 test threeways 10 我会得到类型
  • Ocaml 模块和包的区别

    我基本上是在尝试遵循这篇文章中的 stackoverflow 答案 OCaml 中 HttpRequest 的最佳模块是什么 https stackoverflow com questions 14134116 what is the be
  • 使用fold_left/right反转OCaml中的列表

    更新 解决方案 感谢 jacobm 的帮助 我想出了一个解决方案 Folding Recursion let reverse list 3 theList List fold left fun element recursive call
  • 为什么计算斐波那契数需要很长时间?

    几天前我开始学习Ocaml 我尝试编写一个斐波那契数字程序 let rec fib a if a 1 a 2 then 1 else fib a 1 fib a 2 该代码不是最佳的 因为我不知道如何处理异常情况 但现在 如果我尝试计算 f
  • ocaml 命令行找不到“topfind”

    我已经安装了opam run opam init run opam switch 4 06 0这创造了一个4 06 0里面的目录 opam 运行 评估opam confing env 出口 OCAML TOPLEVEL PATH as op
  • 在 OCaml 中,这是什么类型定义:'a.单位 -> 'a

    问题 这是我第一次看到像这样的类型定义 a unit gt a in 记录中的显式多态类型 https stackoverflow com questions 23320990 explicit polymorphic type in re

随机推荐