我试图在函数内部创建一个本地求和类型,然后返回所述求和类型,而无需在 main 中声明它。这可能吗?我不相信它是直接的,但我一直在尝试使用 GADT 和多态变体来尝试找到解决方法,但我对 OCaml 仍然相当陌生,并没有完全理解它们。
我希望该函数执行以下操作。给定一个 ('a, 'b) 类型的元组,返回第一个元素,但类型为 'a 和 'b 之间的和。
从 gallais 的回答,我尝试使用
type ('a, 'b) either = | Left of 'a | Right of 'b
,但无法让它工作。
这是我的第一篇堆栈溢出帖子,所以我感谢任何反馈
说你想定义一个函数的本地类型并没有多大意义。函数体是一个表达式,即它是由值而不是类型组成的。您可以在模块中定义函数本地的类型。但模块中定义的构造函数不允许逃逸函数的作用域。
# 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 模块系统来定义抽象类型。使类型和函数都成为模块的本地函数。