Data structures 使用Set.Make.iter转换集合的元素?

Data structures 使用Set.Make.iter转换集合的元素?,data-structures,iterator,set,ocaml,Data Structures,Iterator,Set,Ocaml,我有一个库,它实现了一个集合接口,文档如下:。除了这个片段,我了解一切: val iter : ('a -> unit) -> 'a t -> unit (** [iter f s] applies [f] to all elements in set [s]. The elements are passed to [f] in increasing order with respect to the ordering used to create the

我有一个库,它实现了一个集合接口,文档如下:。除了这个片段,我了解一切:

val iter : ('a -> unit) -> 'a t -> unit 
(** [iter f s] applies [f] to all elements in set [s].  The elements
    are passed to [f] in increasing order with respect to the ordering
    used to create the set. *)
所以iter把一个函数作为论点之一,并将其应用于集合的所有元素。所以我期望像'a->'这样的东西,它接受集合中的一个元素并将其更改为具有其他值的相同类型的元素,或者'a->'b接受'a t并将其转换为'b t。但相反,iter采用类型为'a->unit的函数,并返回unit,而不是'a t或'b t'


那么,传递给iter的示例函数应该是什么样子呢

这将是一个具有副作用的功能,如下所示:

Let p x = Printf.printf "%d\n" x

这将是一个有副作用的函数,如下所示:

Let p x = Printf.printf "%d\n" x
国际热核聚变实验堆不会改变集合的元素。这纯粹是因为它的副作用。您可以使用它打印元素,例如:

module StringSet = Set.Make(String)
…
StringSet.iter print_endline ss
集合数据结构是不可变的,因此不能更改集合的元素。您可以构建一个新的集合,其元素是从现有集合派生的。对于列表,有一个函数映射,它接受一个列表[x1;…;xn],并返回一个新列表[f x1;…;f xn]。Set模块中没有类似的函数,因为集合中的元素不是按调用者选择的顺序存储的:不存在集合及其元素按从另一个集合派生的顺序存储的情况。如果要从集合元素的图像构建集合,请逐个插入新元素

module Int = struct
  type t = int
  let compare = Pervasives.compare
end
module IntSet = Set.Make(Int)
module StringSet = Set.Make(String)
let int_to_string_set is =
  IntSet.fold (fun i ss -> StringSet.add (string_of_int i) ss) is StringSet.empty
国际热核聚变实验堆不会改变集合的元素。这纯粹是因为它的副作用。您可以使用它打印元素,例如:

module StringSet = Set.Make(String)
…
StringSet.iter print_endline ss
集合数据结构是不可变的,因此不能更改集合的元素。您可以构建一个新的集合,其元素是从现有集合派生的。对于列表,有一个函数映射,它接受一个列表[x1;…;xn],并返回一个新列表[f x1;…;f xn]。Set模块中没有类似的函数,因为集合中的元素不是按调用者选择的顺序存储的:不存在集合及其元素按从另一个集合派生的顺序存储的情况。如果要从集合元素的图像构建集合,请逐个插入新元素

module Int = struct
  type t = int
  let compare = Pervasives.compare
end
module IntSet = Set.Make(Int)
module StringSet = Set.Make(String)
let int_to_string_set is =
  IntSet.fold (fun i ss -> StringSet.add (string_of_int i) ss) is StringSet.empty
iter接受这样一个函数,该函数接受类型为“a”的参数,并返回类型为“unit”的值。换言之,由于它不能返回任何有价值的东西,因此需要对其副作用进行评估

您要寻找的是一个map函数,它通常接受类型为“a->”b的函数,并返回类型为“a”的元素的容器,返回类型为“b”的元素的容器。不幸的是,您显示的界面没有提供这样的功能。但这不是问题,因为它提供了折叠函数,这是最通用的迭代器。只有fold,您就可以实现任何其他迭代器,比如map、iter、exists等等。。。实际上,在核心库中你们可以找到Container.Make函子,它将自动从一个函数fold派生出一个公共容器接口。但是,您也可以自己定义地图:

let map f xs =
  fold (fun x ys -> add (f x) ys) xs empty
iter接受这样一个函数,该函数接受类型为“a”的参数,并返回类型为“unit”的值。换言之,由于它不能返回任何有价值的东西,因此需要对其副作用进行评估

您要寻找的是一个map函数,它通常接受类型为“a->”b的函数,并返回类型为“a”的元素的容器,返回类型为“b”的元素的容器。不幸的是,您显示的界面没有提供这样的功能。但这不是问题,因为它提供了折叠函数,这是最通用的迭代器。只有fold,您就可以实现任何其他迭代器,比如map、iter、exists等等。。。实际上,在核心库中你们可以找到Container.Make函子,它将自动从一个函数fold派生出一个公共容器接口。但是,您也可以自己定义地图:

let map f xs =
  fold (fun x ys -> add (f x) ys) xs empty