1

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

例如,yaml/ ppx_deriving_yamlopam 模块包含一个[@@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_yamlBooks模块外部访问,则它不可用。

为什么这个功能不可用?它是如何访问的?

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

我的假设是,这是特定于派生和模块如何工作的东西。

4

1 回答 1

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);
于 2021-06-02T07:09:22.043 回答