OCaml 返回未命名的总和类型

问题描述 投票:0回答:1

我试图在函数内部创建一个本地求和类型,然后返回所述求和类型,而无需在 main 中声明它。这可能吗?我不相信它是直接的,但我一直在尝试使用 GADT 和多态变体来尝试找到解决方法,但我对 OCaml 仍然相当陌生,并没有完全理解它们。

我希望该函数执行以下操作。给定一个 ('a, 'b) 类型的元组,返回第一个元素,但类型为 'a 和 'b 之间的和。

gallais 的回答,我尝试使用

type ('a, 'b) either = | Left  of 'a | Right of 'b
,但无法让它工作。

这是我的第一篇堆栈溢出帖子,所以我感谢任何反馈

ocaml sum-type
1个回答
1
投票

说你想定义一个函数的本地类型并没有多大意义。函数体是一个表达式,即它是由值而不是类型组成的。您可以在模块中定义函数本地的类型。但模块中定义的构造函数不允许逃逸函数的作用域。

# let f x =
  let module M = struct type 'a t = T of 'a end in
   M.T x;;
Error: [...] The type constructor M.t would escape its scope

使用全局定义的类型,你的函数很容易编写:

type ('a, 'b) either = | Left  of 'a | Right of 'b

let f (a, b) = Left a

这是该函数的一个应用:

# f (3, "yes");;
- : (int, 'a) either = Left 3

我认为使用 GADT 或多态变体没有帮助。它们很复杂,但不允许违反范围规则,这是另一回事。

如果您需要的话,您可以使用 OCaml 模块系统来定义抽象类型。使类型和函数都成为模块的本地函数。

© www.soinside.com 2019 - 2024. All rights reserved.