問題タブ [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 がファンクターの結果を正しく「見る」ことができないためですか?)
どうすればこれを修正できますか?

また、バリアント モジュールを個別に定義するのをスキップして、次のようにできるようにしたいと考えています。

...しかし、これによりエラーが発生します:

何が悪いのかわかりません。