Haskell 为联合数据类型定义可存储实例

Haskell 为联合数据类型定义可存储实例,haskell,vector,storable,Haskell,Vector,Storable,如何定义以下数据类型的实例(由GHC基元类型组成): 我检查了这一点,但它只适用于相同类型的向量,而不是像上面那样的并集。您必须对用于实例化类型的构造函数进行编码 例如,您可以添加一个字节来指定所使用的构造函数的索引。这意味着上述值可以按如下方式存储: Haskell Binary I 3 -> 00 00 00 00 03 S 4 -> 01 00 04 XX XX ^ Data ^ Constructor i

如何定义以下数据类型的实例(由GHC基元类型组成):


我检查了这一点,但它只适用于相同类型的向量,而不是像上面那样的并集。

您必须对用于实例化类型的构造函数进行编码

例如,您可以添加一个字节来指定所使用的构造函数的索引。这意味着上述值可以按如下方式存储:

Haskell    Binary
I 3     -> 00 00 00 00 03
S 4     -> 01 00 04 XX XX
              ^ Data
           ^ Constructor index
XX = unused byte

然后,当您想从字节字符串中反序列化一个值时,您可以查看第一个字节,查看它是哪个索引,并根据该索引选择要使用的构造函数(以及下一步要查看的内容)。

您必须对用于实例化类型的构造函数进行编码

例如,您可以添加一个字节来指定所使用的构造函数的索引。这意味着上述值可以按如下方式存储:

Haskell    Binary
I 3     -> 00 00 00 00 03
S 4     -> 01 00 04 XX XX
              ^ Data
           ^ Constructor index
XX = unused byte

然后,当您想从字节字符串中反序列化一个值时,您可以查看第一个字节,查看它是哪个索引,然后根据该索引选择要使用的构造函数(以及下一步要查看的内容)。

@Chris:真的吗?在我的印象中,C中的工会只是拥有相同的记忆。程序员有责任知道使用哪个联合的“实例”。许多程序员都是使用标签技术手动完成这项工作的,就像这个答案中描述的那样。老实说,我认为联合数据类型根本不适合存储。我强烈建议你们只使用普通的盒装向量。@Chris:真的吗?在我的印象中,C中的工会只是拥有相同的记忆。程序员有责任知道使用哪个联合的“实例”。许多程序员都是使用标签技术手动完成这项工作的,就像这个答案中描述的那样。老实说,我认为联合数据类型根本不适合存储。我强烈建议你们只使用正规的盒装向量。