Haskell protobuf:不明确的类型变量

Haskell protobuf:不明确的类型变量,haskell,protocol-buffers,Haskell,Protocol Buffers,通常我知道如何解决不明确的类型变量问题,但这次我不知道。长话短说,我使用Haskell库进行工作。该库使您忘记了维护单独的.proto文件,如果数据类型分别是Encode和Decode类型类的实例,它派生了序列化和反序列化数据类型的方法 我正在protobuf之上设计一个简单的协议。有一个主消息数据类型,包含消息id、消息类型和一些取决于类型的可选数据。我希望有一个函数,可以获取消息id、消息类型和可选数据(需要是Encode类的实例),并创建一个MyMessage的新实例,其中可选数据提前序列

通常我知道如何解决不明确的类型变量问题,但这次我不知道。长话短说,我使用Haskell库进行工作。该库使您忘记了维护单独的.proto文件,如果数据类型分别是Encode和Decode类型类的实例,它派生了序列化和反序列化数据类型的方法

我正在protobuf之上设计一个简单的协议。有一个主消息数据类型,包含消息id、消息类型和一些取决于类型的可选数据。我希望有一个函数,可以获取消息id、消息类型和可选数据(需要是Encode类的实例),并创建一个MyMessage的新实例,其中可选数据提前序列化为ByteString

我就是这样做的:

{-#语言数据类型}
{-#派生通用语言}
导入Data.ByteString(ByteString)
导入数据.Int
导入数据,也许吧
导入数据.幺半群
导入数据.ProtocolBuffers
导入数据。序列化
导入数据.Text(文本,包)
进口GHC.仿制药(仿制药)
导入GHC.TypeLits
数据MyMsgType=MSG_TYPE_1
|味精类型2
派生(枚举、显示)
数据MyMessage=MyMessage{
msgId::必需1(值Int64)
,msgType::必需2(枚举MyMsgType)
,cpData::可选3(值ByteString)
}派生(通用、显示)
实例编码MyMessage
实例解码MyMessage
createMessage::Encode a=>Int64->MyMsgType->maybea->MyMessage
createMessage msgId msgType optionalData=
MyMessage(putField msgId)(putField msgType)(putField$serialiseOptionalData optionalData)
serialiseMessage::MyMessage->ByteString
serialiseMessage=runPut。EncodeLength前缀消息
serialiseOptionalData::EncodeA=>MaybeA->MaybyByTestRing
serialiseOptionalData Nothing=无
serialiseOptionalData(仅限ctx)=
只是runPut。EncodeLength前缀消息$ctx
尝试使用createMessage函数时,出现以下错误:

λ>创建消息1消息类型1无
:7:1:
没有因使用“createMessage”而产生的(Encode a0)实例
类型变量“a0”不明确
注意:有几个潜在的例子:
实例encodemymessage——在test.hs:24:10中定义
实例编码
(无序容器-0.2.6.0:Data.HashMap.Base.HashMap
protobuf-0.2.1.0:Data.ProtocolBuffers.Wire.Tag
[protobuf-0.2.1.0:Data.ProtocolBuffers.Wire.WireField])
--在“protobuf-0.2.1.0:Data.ProtocolBuffers.Encode”中定义
在表达式中:createMessage 1 MSG\u TYPE\u 1 Nothing
在“it”的等式中:it=createMessage 1 MSG\u TYPE\u 1 Nothing

有人能解释一下为什么会出现这个错误,以及如何修复它吗?我不知道编译器究竟在哪里看到了歧义。

您需要提供更多关于可选数据类型的信息。当您使用
Nothing
作为类型
可能是a
的值时,编译器无法准确推断
a
是什么类型。您可以通过显式地将类型指定给
Nothing
,如
(Nothing::Maybe Foo)

您需要提供有关可选数据类型的更多信息。当您使用
Nothing
作为类型
可能是a
的值时,编译器无法准确推断
a
是什么类型。你可以通过显式地给
Nothing
指定一个类型来修复它,就像在
(Nothing::Maybe Foo)
“干杯,伙计,你无法想象我花了多少时间试图找出什么是错的:)干杯,伙计,你无法想象我花了多少时间试图找出什么是错的:)