OCaml:具有多态性变体的类型推断

OCaml:具有多态性变体的类型推断,ocaml,type-inference,Ocaml,Type Inference,函数f参数类型是[

函数
f
参数类型是
[<'A |'B]
这就是我想要的

# let rec f = function
  | `A -> 0
  | `B -> let _ = f in 1
;;
val f : [< `A | `B ] -> int = <fun> 

我仍然需要递归调用
f'A
,但是如何保持类型
[<'A|'B]

这是
let
-多态性约束的另一个实例,它阻碍了多态递归函数的使用。因为,OCAML3.12我们有一个声明,您的函数是多态的

您的情况稍微复杂一点,因为您有隐式类型变量,它发生在行多态类型中。也许有更好的方法,但我的方法是使用下面的类型定义使这个类型变量显式

type 'a t = 'a constraint 'a = [< `A | `B]
以防万一,如果您不想公开这个
'a t
,那没关系,因为您不是必需的,
'a t
等于
[
它只是使
'a
类型变量显式:

module M : sig
  val f : [< `A | `B] -> int
  end = struct
let rec f : 'a . 'a t -> int = function
  | `A -> 0
  | `B -> let _ = f `A  in 1
end;;

当然,对于非平凡类型,这不会进行缩放。

为什么这种类型是一个问题?@Drup我想将
['B]
类型的值传递给
f
。我知道我可以传递类型为
[>'B]
的值,但这将放松我的其他代码的静态类型保证。
let rec f : 'a . 'a t -> int = function
| `A -> 0
| `B -> let _ = f `A  in 1
module M : sig
  val f : [< `A | `B] -> int
  end = struct
let rec f : 'a . 'a t -> int = function
  | `A -> 0
  | `B -> let _ = f `A  in 1
end;;
let rec f : 'a . ([< `A | `B] as 'a) -> int = function
  | `A -> 0
  | `B -> let _ = f `A  in 1