我的代码如何在不同的记录中进行自动遍历并将它们转换为Hashtbl(类型派生)?

时间:2013-06-20 11:29:34

标签: ocaml

我希望对不同的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”}


我该怎么做?如何使用代码分析记录类型?

3 个答案:

答案 0 :(得分:3)

你做不到。 由于类型安全,OCaml没有内省库。

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

请注意,缺乏内省能力是OCaml编译团队的强大选择。

答案 1 :(得分:2)

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

或者(并且这是一个更好的主意,因为更简单),您可以使用现有的扩展,例如sexplib(s-expressions)或者其中一个生成JSON转换器,然后使用该表示( s-expressions或JSON)将其转换为哈希表。

答案 2 :(得分:1)

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