如果在 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 ^^^^^^^^^^^^
我的假设是,这与派生和模块的工作方式有关。
答案 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);