OCaml:从函数创建记录

OCaml:从函数创建记录,ocaml,Ocaml,我尝试创建一个节点记录,但没有成功。假设我有另一个具有相同节点属性的类型,我如何告诉ocaml要创建哪种类型的对象 谢谢。显然,您的函数无法工作,因为您忘记了与空列表匹配: type node = { lan: string; lat: string; };; let rec read_nodes_from_list list = match list with | Xml.Element("node", _, _)::list' -> {lan="A"; lat="B"}:

我尝试创建一个节点记录,但没有成功。假设我有另一个具有相同节点属性的类型,我如何告诉ocaml要创建哪种类型的对象


谢谢。

显然,您的函数无法工作,因为您忘记了与空列表匹配:

type node = {
  lan: string;
  lat: string;
};;

let rec read_nodes_from_list list = match list with
  | Xml.Element("node", _, _)::list' -> {lan="A"; lat="B"}::read_nodes_from_list list'
;;
实际上,您要做的是在列表上执行
map
操作,因此您的函数可以编写得更优雅,如下所示:

let rec read_nodes_from_list list = match list with
  | Xml.Element("node", _, _)::list' -> {lan="A"; lat="B"}::read_nodes_from_list list'
  | [] -> []
但是,该函数可能不起作用,因为
Xml.Element
上的模式匹配并非详尽无遗。在处理剩余的案件时,你应该小心。例如,类似这样的方法会起作用:

let read_nodes_from_list list =
   List.map (fun (Xml.Element("node", _, _)) -> {lan="A"; lat="B"}) list

为了回答您关于记录类型的问题,它认为使用相同字段标签的两个记录类型是一种不好的做法。您仍然可以将这些记录类型放在不同的子模块中,并使用模块前缀来区分它们。但是正如我所说的,在同一个模块中有两种相似的记录类型会给您和OCaml编译器带来混乱。

谢谢!如果我有两个具有相同属性的类型,我如何告诉ocaml要创建哪种类型的对象呢?它们必须位于不同的模块(子模块或其他模块)中,并且为了避免上述混淆,不能打开它们。对于给定的模块
X
,可以使用
{X.attr1=…;att2=…;}
的常规模块前缀语法引用每个模块。
let read_nodes_from_list list =
   List.map (function | (Xml.Element("node", _, _)) -> {lan="A"; lat="B"}
                      | _ -> {lan=""; lat=""}) list