首页 > 解决方案 > 一般如何将变体类型的值转换为字符串?

问题描述

假设我有一个由以下数据构造函数组成的 sum 类型......

type Entity =
 | Student 
 | Staff
 | Classes

有没有一种方法可以将给定 sum 类型的值多态转换为 string 类型的值,而无需采用以下方法。

let showEntity = e =>
 switch (e){
 | Student   => "Student" 
 | Staff     => "Staff"
 | Classes   => "Classes"

标签: reason

解决方案


它是在 OCaml/Reason 中使用 ppx 预处理完成的,例如,使用 ppx_deriving 库1

[@deriving show({with_path: false})]
type t = Hello | World;

let main () =
  print_endline("Hello, " ++ show(World));

main ();

并运行它dune exec ./main.exe向我们展示了我们心爱的人

dune exec ./main.exe
Hello, World

前提是代码在文件中,并且在同一个文件夹中main.re有一个名为的文件,内容如下dune

(executable
 (name main)
 (preprocess (pps ppx_deriving.std)))

并且ppx_deriving库和dune已安装,假设您使用的是 opam。如果您使用的是 bucklescript,请安装bs- deriving包。事实上,有很多库提供派生程序以及不同的派生程序,因此很难推荐一个(并且建议一个库超出了 SO 的范围,因此将其视为一般演示)。


1) 还要注意,如果我们将使用不带参数的派生器,则show派生器需要一个参数{with_path: false),例如,

 [@deriving show]
 type t = Hello | World;

它将显示以模块名称为前缀的名称,这可能不是您想要的。


推荐阅读