使用sexplib序列化Ocaml类型

时间:2017-01-22 16:20:17

标签: ocaml

我正在尝试使用sexplib序列化和反序列化自定义ocaml记录类型,该记录类型具有如下内联定义

type eff = Add of {username: string; pwd: string}
| AddFollowing of {leader_id: id}
| RemFollowing of {leader_id: id}
| AddFollower of {follower_id: id}
| RemFollower of {follower_id: id} 
| Blocks of {follower_id: id}
| GetBlocks
| IsBlockedBy of {leader_id: id}
| GetIsBlockedBy
| GetInfo
| GetFollowers
| GetFollowing [@@deriving sexp]

当我尝试使用ocamlfind ocamlc -package sexplib,ppx_sexp_conv -linkpkg microblog_app.ml编译时,我收到错误Failure("Pcstr_record not supported") File "microblog_app.ml", line 1: Error: Error while running external preprocessor

我看到ppx_sexp_conv在当前版本中不支持内联定义。不幸的是,我不能使用他们的开发版本 导致版本与我的其他包冲突。所以我试着改变内联定义如下

type usernamePwd = {username: string; pwd: string}
type leaderId = {leader_id: id}
type followerId = {follower_id: id}
type eff = Add of usernamePwd
| AddFollowing of leaderId
| RemFollowing of leaderId
| AddFollower of followerId
| RemFollower of followerId
| Blocks of followerId
| GetBlocks
| IsBlockedBy of leaderId
| GetIsBlockedBy
| GetInfo
| GetFollowers
| GetFollowing [@@deriving sexp]

我只在后面的代码中使用函数sexp_of_effeff_of_sexp。当我编译它时,我收到错误Error: Unbound value usernamePwd_of_sexp。我根本不在我的代码中使用此功能。有人可以告诉我如何解决这个错误吗?

1 个答案:

答案 0 :(得分:2)

您添加的[@@deriving sexp]注释会生成一些调用usernamePwd_of_sexp的代码(由于ppx的工作方式,它无法知道此函数是否存在,因此它依赖于它的存在)。

此功能不存在。您可以通过将[@@deriving sexp]添加到usernamePwd声明(以及其他类型)来创建它。

另一种方法是使您的类型声明递归(type usernamePwd = ... and leaderId = ... and type eff = ... [@@deriving sexp])。