Ocaml 如何在没有冗余匹配情况下转换泛型变体实例?

Ocaml 如何在没有冗余匹配情况下转换泛型变体实例?,ocaml,Ocaml,我有以下通用变量类型: type'a t=a | B | C | D | E | a的值 以及将int t转换为string t 让int-to-sting=函数 |值x->值(字符串x/int x) |一些->一些 此函数不可编译,因为 |一些->一些 错误:此表达式的类型为int t,但应为表达式 类型为字符串t int类型不兼容 即使它有类型注释 让int\u插入:int t->string t=函数 |值x->值(字符串x/int x) |一些->一些 我可以用英语重写它 让int

我有以下通用变量类型:

type'a t=a | B | C | D | E | a的值
以及将
int t
转换为
string t

让int-to-sting=函数
|值x->值(字符串x/int x)
|一些->一些
此函数不可编译,因为

|一些->一些
错误:此表达式的类型为int t,但应为表达式 类型为字符串t
int类型不兼容

即使它有类型注释

让int\u插入:int t->string t=函数
|值x->值(字符串x/int x)
|一些->一些
我可以用英语重写它

让int-to-sting=函数
|值x->值(字符串x/int x)
|A->A
|B->B
|C->C
|D->D
|E->E
但长长的构造函数列表看起来是冗余的。
在我的第一个实现中,是否可以转换一些,以避免这种嘈杂的代码?

您可以通过枚举并将它们绑定到一个名称来稍微减少冗余:

let int_to_sting = function
  | Value x -> Value (string_of_int x)
  | (A | B | C | D | E) as some -> some
另一个明显不安全且您绝对不应该使用的选项是使用
Obj.magic
绕过类型系统:

let int_to_sting = function
  | Value x -> Value (string_of_int x)
  | some    -> (Obj.magic (some: int t): string t)
这是因为无论类型参数如何,这些值的表示形式都是相同的。但是如果你要添加另一个不是。。。然后你就崩溃了