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

Ocaml 我的代码如何在不同的记录中进行自动遍历,并将它们转换为Hashtbl(类型派生)?,ocaml,Ocaml,我希望遍历不同的任意记录,并对它们进行分析,然后将它们转换为Hashtbl。代码会自动执行,不管它是什么记录结构 例如,我想将各种记录(可能是不同的记录类型)转换为哈希表 比如说,记录在案 { name = "john"; age = 50; } 然后,如果我运行代码,那么这个记录将自动转换为一个Hashble,它有两个{key,value}对,{“name”,“john”}和{“age”,“50”}。请注意,这里我希望我的代码能够检测到50是一个int,因此它将使用string

我希望遍历不同的任意
记录
,并对它们进行分析,然后将它们转换为
Hashtbl
。代码会自动执行,不管它是什么
记录结构


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

比如说,记录在案

{
   name = "john";
   age = 50;
}
然后,如果我运行代码,那么这个记录将自动转换为一个
Hashble
,它有两个{key,value}对,{“name”,“john”}和{“age”,“50”}。请注意,这里我希望我的代码能够检测到
50
是一个int,因此它将使用
string\u of_int
将其转换为
string

如果另一张唱片来了,就说

{
   id = 12;
   type = "book"
   price = 34.5
}
然后我的代码将自动生成一个
Hashtbl
-{“id”,“12”},{“type”,“book”},{“price”,“34.5”}


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

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

但也有关于“运行时类型”的研究:这是允许的

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

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

但也有关于“运行时类型”的研究:这是允许的

请注意,缺乏内省能力是OCaml编译器团队的一个重要选择。

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

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

您可以使用或工具/框架实现语法扩展,该扩展接受记录类型声明,并生成预期的转换代码(转换为哈希表)


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

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

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

你的意思是我不使用record,只使用Hashtbl?好的,我知道了,但它只是使用record对客户端更方便。我的建议是在服务器上使用一种数据类型,它代表数据的实际外观。如果数据是由嵌套的名称/值对组成的,我建议使用这样的数据类型。我没有在OCaml中使用它,但我发现JSON相当不错。似乎有一个名为Yojson的ocamljson库。正如gasche所建议的,可能有一些方法可以帮助客户机在JSON之间转换数据。对不起,我应该说清楚。我用ocaml和Bson.ml生成了一个MongoDB驱动程序。我的客户是指使用我的API的人。例如,我希望我的Bson库可以接受任意的
记录类型
,并将其转换为
Bson类型
。否则,用户必须手动使用当前的EssentialAPI来构建他们的Bson文档,这种方式就像构建Hashtbl一样。写一个记录比写一个hashtble容易,我猜你的意思是我不使用记录,只使用Hashtbl?好的,我知道了,但只是使用记录对客户端更方便。我的建议是在服务器上使用一种数据类型,它代表数据的实际外观。如果数据是由嵌套的名称/值对组成的,我建议使用这样的数据类型。我没有在OCaml中使用它,但我发现JSON相当不错。似乎有一个名为Yojson的ocamljson库。正如gasche所建议的,可能有一些方法可以帮助客户机在JSON之间转换数据。对不起,我应该说清楚。我用ocaml和Bson.ml生成了一个MongoDB驱动程序。我的客户是指使用我的API的人。例如,我希望我的Bson库可以接受任意的
记录类型
,并将其转换为
Bson类型
。否则,用户必须手动使用当前的EssentialAPI来构建他们的Bson文档,这种方式就像构建Hashtbl一样。写一个记录比写一个哈希表容易,我猜有些函数是派生的。例如,
Hashtbl.hash
val hash:'a->int Hashtbl.hash x将非负整数与任何类型的值相关联。可以保证,如果x=y或pervisives.compare x y=0,则hash x=hash y。此外,即使在循环结构上,散列也总是终止。
,那么这些函数如何处理任意类型呢?它们是由运行时实现的,它有一些值结构的帮助。它无法恢复完整的类型信息,但是(
Hashtbl.hash
无法区分
[]
0