0

我希望对不同的任意项进行遍历records并分析它们,然后将它们转换为Hashtbl. 不管record structure它是什么,代码都会自动完成。


例如,我想将各种记录(可能是不同的记录类型)转换成哈希表。

说,为了记录

{
   name = "john";
   age = 50;
}

然后如果我运行我的代码,那么这条记录将自动转换为Hashble具有两个 {key, value} 对,{“name”,“john”} 和 {“age”,“50”}。请注意,在这里我希望我的代码可以检测到50是一个 int,因此它将用于string_of_int将其转换为string.

如果另一个记录来了,说

{
   id = 12;
   type = "book"
   price = 34.5
}

那么我的代码会自动生成Hashtbl- {"id", "12"}, {"type", "book"}, {"price", "34.5"}


我怎样才能做到这一点?如何使用代码分析记录类型?

4

3 回答 3

3

你不能。由于类型安全,OCaml 没有自省库。

但是有关于“运行时类型”的研究:http: //www.lexifi.com/files/resources/runtime_types.pdf允许这样做。

请注意,缺乏自省能力是 OCaml 编译器团队的一个强有力的选择。

于 2013-06-20T13:09:25.813 回答
2

您可以使用type_conv派生工具/框架来实现一个语法扩展,该扩展采用您的记录类型声明,并生成预期的转换代码(到哈希表)。

或者(这是一个更好的主意,因为更简单),您可以使用现有的扩展,例如sexplib(s 表达式)或生成 JSON 转换器的那些,然后从该表示(s 表达式或 JSON)工作到将其转换为哈希表。

于 2013-06-20T13:23:58.907 回答
1

换一种说法,其他人所说的,其字段在运行时确定的记录不是 OCaml 记录。OCaml 具有静态类型,即在编写程序时固定的类型。我认为在 OCaml 中进行的最佳方法是将数据重新概念化为字典,即一组动态的名称/值对。字典的 OCaml 类型是 Hashtbl 和 Map。现在你的问题很容易回答(在我看来)。

于 2013-06-20T14:33:08.507 回答