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