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要创建哪个类型的对象?
谢谢。
答案 0 :(得分:6)
显然,你的功能不起作用,因为你忘了与空列表匹配:
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编译器带来困惑。