问题标签 [ppx]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
134 浏览

ocaml - OCaml 将(无参数)变体序列化为“字符串枚举”(通过 Yojson)

假设我正在建立一个记录类型:

但我希望将 的可能值fruit限制为一组固定的字符串。

在 OCaml 中将其建模为变体似乎很自然,例如:

到目前为止还好。

但是如果我[@@deriving yojson]在这些类型上使用,那么序列化的输出将是:

默认情况下,Yojson 想要将一个变体序列化为一个元组[<name>, <args>...]......我可以看到它的逻辑,但在这里没有帮助。

我希望它序列化为:

利用几个 ppx 派生插件,我设法构建了这个模块以根据需要进行反序列化:

哪个工作正常......但我有一些其他“字符串枚举”变体我想以同样的方式对待。我不想每次都复制和粘贴这段代码。

我做到了这一点:

这似乎是类型检查,我可以:

...但是当我尝试:

我明白了Error: Unbound value FruitEnum.t

似乎是因为我type t = V.t从变体的模块重新导出,但我不太明白。(或者是因为 yojson ppx 无法正确“看到”仿函数的结果?)
我该如何解决这个问题?

我还希望能够跳过单独定义变体模块并执行以下操作:

...但这给出了错误:

我不明白出了什么问题。

0 投票
1 回答
67 浏览

ocaml - 如何在 utop 中使用 ppx 派生?

如何在我的 utop 中使用 ppx 派生( https://github.com/ocaml-ppx/ppx_deriving )?

例如,我必须遵循以下代码:

0 投票
2 回答
53 浏览

ocaml - 如何将 [@@deriving show] 应用于我的函子的模块参数中的类型?

我有一个仿函数,它的Set类型如下:

S.elt是集合元素的类型

我想以某种方式将[@@deriving show](来自https://github.com/ocaml-ppx/ppx_deriving#plugin-show)应用到S.elt我的仿函数中,以便在我的一种方法中,我可以依赖一个show : S.elt -> string可用的函数。

我觉得这一定是可能的,但我无法找出正确的语法。

或者 - 如果有一种方法可以在签名中指定 Set 类型S具有“可显示”类型的元素。

例如我可以定义:

...但我不知道如何将其指定为对元素的类型约束(S : Set.S)

0 投票
1 回答
44 浏览

ocaml - 如何强制 ppx 使用 OCaml 版本?

我有下面的 OCaml 文件,它可以在没有这个文件的情况下正确编译ppx并且失败dune

并与

错误是

这是有问题的 OCaml 文件,它使用了一种新语法(并提供了一个等效的 - 我相信 - 当它不可用时的版本)

为了确认错误的来源(并首先运行以避免浪费时间..),该命令 dune build --verbose确实指向发生在ppx

可以强制ppx使用 4.13,还是在 ppx 与给定版本不兼容时收到警告?(或者它是一个错误?)