OCaml - 从另一个模块访问派生函数

时间:2021-06-02 07:09:22

标签: ocaml ppx

如果在 lib 中的模块中定义了一条记录,并且它包含生成函数的 deriving 注释,那么这些函数如何在另一个模块中使用?

例如,yaml/ppx_deriving_yaml opam 模块包含一个 [@@deriving yaml]。如果将 [@@deriving yaml] 应用于记录,则会生成函数,例如 {record_name}_to_yaml,它将记录转换为 Yaml 数据结构。

示例:当[@@deriving yaml]添加到book记录时,编译时会生成几个函数,一个是book_to_yaml

(* ./lib/books.ml *)
type book = { 
  title: string;
  authors: string list
} [@@deriving yaml]

但是如果您尝试从 book_to_yaml 模块外部访问 Books,它是不可用的。

为什么那个功能不可用?如何访问?

(* ./bin/main.ml *)
let () = 
  let (b: book) = { title = "Cryptonomicon"; authors = [ "Neal Stephenson" ] } in
  Yaml.pp Stdlib.Format.std_formatter (book_to_yaml b);
                                 Error ^^^^^^^^^^^^

我的假设是,这与派生和模块的工作方式有关。

1 个答案:

答案 0 :(得分:0)

这并没有回答为什么,但这是我找到的解决问题的一种方法。

假设图书馆名为“书店”:

(* ./lib/dune *)
(library
  (name bookstore)
  (libraries yaml)
  (preprocess
    (pps ppx_deriving_yaml)))

可以在有记录的模块中定义一个函数,直接暴露生成的函数。在这种情况下,book_to_yaml 将通过名为 convert_book_to_yaml 的函数公开。

type book = { 
  title: string;
  authors: string list
} [@@deriving yaml]

let convert_book_to_yaml = book_to_yaml

现在您可以通过添加 convert_book_to_yaml 或直接使用完整的命名空间 open Bookstore.Books 来访问 Bookstore.Books.convert_book_to_yaml

(* ./bin/main.ml *)
let () = 
  let (b: Bookstore.Books.book) = { title = "Cryptonomicon"; authors = [ "Neal Stephenson" ] } in
  Yaml.pp Stdlib.Format.std_formatter (Bookstore.Books.convert_book_to_yaml b);
相关问题