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"}::read_nodes_from_list list'
;;

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

谢谢。

最佳答案

很明显,你的函数没有工作,因为你忘记了匹配空列表:

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 read_nodes_from_list list =
   List.map (fun (Xml.Element("node", _, _)) -> {lan="A"; lat="B"}) list

但是,该功能可能无法正常工作,因为 Xml.Element 上的模式匹配并不详尽。处理剩余案例时应小心。例如,这样的事情会起作用:

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

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

关于OCaml:从函数创建记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8596402/

相关文章:

unicode - OCaml:如何解码unicode转义字符串?

元组上的 OCaml 映射

functional-programming - 为什么产品比记录使用更多的内存?

keyboard - OCaml 在没有图形窗口的情况下读取按键

ocaml - 扩展 ocamllex 以获取更大的词典

Ocaml 模式与数据构造函数的匹配与其数量无关

ocaml - 模块, "with type"是做什么的?

arrays - 记录类型中的数组

types - 使用显式类型将对象中的方法的可见性限制为定义它的模块

functional-programming - 静态 "extend"是一种没有间接麻烦的记录数据类型