我希望对不同的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”}
我该怎么做?如何使用代码分析记录类型?
答案 0 :(得分:3)
你做不到。 由于类型安全,OCaml没有内省库。
但是有关于“运行时类型”的研究:http://www.lexifi.com/files/resources/runtime_types.pdf允许这样做。
请注意,缺乏内省能力是OCaml编译团队的强大选择。
答案 1 :(得分:2)
您可以使用type_conv或deriving工具/框架来实现获取记录类型声明的语法扩展,并生成预期的转换代码(到哈希表)。
或者(并且这是一个更好的主意,因为更简单),您可以使用现有的扩展,例如sexplib(s-expressions)或者其中一个生成JSON转换器,然后使用该表示( s-expressions或JSON)将其转换为哈希表。
答案 2 :(得分:1)
就其他人所说的另一种方式而言,其字段在运行时确定的记录不是OCaml记录。 OCaml具有静态类型,即在编写程序时固定的类型。我认为在OCaml中进行的最佳方式是将数据重新概念化为字典,即一组动态的名称/值对。字典的OCaml类型是Hashtbl和Map。现在你的问题很容易回答(在我看来)。