首页 > 解决方案 > 从单个 switch 语句返回各种类型的 ReasonML 方法

问题描述

我有预定义的类型,

type objA = {name: string}
type objB = {age: int}

我想要一个变体类型,

type test = 
| Atype(objA)
| Btype(objB)

并最终使用模式匹配来正确返回每种类型所包含的值。

let testVariant = {name: "helloworld"}
switch(testVariant: test){
| Atype(v) => v
| Btype(v) => v
}

但是由于 Atype 和 Btype 内部的变量值不同,这是不可能的。我的问题是,如何使用模式匹配有条件地返回一些不同类型的数据。

标签: pattern-matchingreasonbucklescript

解决方案


您可以通过使用 GADT 来实现这一点(为了更好地理解,请阅读此Sketch)。

type objA = {name: string};
type objB = {age: int};

type test('a) =
  | Atype(objA): test(string)
  | Btype(objB): test(int);

let testVariant: type a. test(a) => a = {
  fun 
  | Atype(v) => v.name
  | Btype(v) => v.age
};

推荐阅读