有没有办法在 ReasonML 中获取多态变体的标签作为变量

Posted

技术标签:

【中文标题】有没有办法在 ReasonML 中获取多态变体的标签作为变量【英文标题】:Is there a way to get the tag of a polymorphic variant as a variable in ReasonML 【发布时间】:2018-04-26 20:03:29 【问题描述】:

我正在寻找是否可以将以下代码泛化一下。

type recordType = [
  | `Todo(todo, idFunction)
  | `TodoItem(todoItem, idFunction)


let commitItemToSchema = (normalizedSchema, recordType) => 
  switch(recordType)
  | `Todo    (todo,     idFun) => ...normalizedSchema, todo:       addOrModifyById(normalizedSchema.todo,       todo,       idFun)
  | `TodoItem(todoItem, idFun) => ...normalizedSchema, todoItem:   addOrModifyById(normalizedSchema.todoItem,   todoItem,   idFun)
  ;
;

有没有办法可以从变体中获取\'Todo'TodoItem 作为变量?

谢谢

【问题讨论】:

您能提供代码示例中显示的所有内容的类型吗? 【参考方案1】:

如果您向我们展示了完整的类型集,将会很有帮助。 OCaml/BuckleScript/ReasonML 确实支持多态类型。这是在 ReasonML 中使用多态类型的简单类型和值声明。

type wrapper('a) = 
  item: 'a,
  details: string
;

let x = item: 1, details: "This is an int";

这里有两种函数,它们将wrapper 与无限制类型'awrapper 与受限类型'a 作为int

let unrestrictedType = (x: wrapper('a)) => 
  Js.log(x);
;

let restrictedType = (x: wrapper(int)) => 
  Js.log(x);
;

【讨论】:

【参考方案2】:

如果变体可以作为变量传递,在这种情况下它会丢失类型检查。我不认为 ReasonML 支持这一点。

【讨论】:

以上是关于有没有办法在 ReasonML 中获取多态变体的标签作为变量的主要内容,如果未能解决你的问题,请参考以下文章

boost::variant 和多态性

Shopify - 通过多个变体 ID 检索多个变体详细信息

多态变体和构造函数

我们如何在 Shaka 播放器中获取当前渲染流的详细信息?

内联记录是否包含多态变体?

有没有办法使用“任意”变体作为参数?