OCaml:从函数创建记录

Ste*_*eve 3 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'
;;
Run Code Online (Sandbox Code Playgroud)

我试过这个来创建一个节点记录,但它不起作用.假设我有另一种类型具有相同属性的节点,如何告诉ocaml要创建哪种类型的对象?

谢谢.

pad*_*pad 6

显然,你的功能没有用,因为你忘了与空列表匹配:

let rec read_nodes_from_list list = match list with
  | Xml.Element("node", _, _)::list' -> {lan="A"; lat="B"}::read_nodes_from_list list'
  | [] -> []
Run Code Online (Sandbox Code Playgroud)

您实际上要做的是map列表上的操作,因此您的函数可以更优雅地编写如下:

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

但是,该功能可能不起作用,因为模式匹配Xml.Element并非详尽无遗.处理剩余案件时应小心.例如,像这样的东西可以工作:

let read_nodes_from_list list =
   List.map (function | (Xml.Element("node", _, _)) -> {lan="A"; lat="B"}
                      | _ -> {lan=""; lat=""}) list
Run Code Online (Sandbox Code Playgroud)

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