我希望编写一个函数,它接受实现某个签名的模块和与这些模块相同类型的实例作为参数。但是由于模块的作用域问题(模块和其实例都是参数),我似乎无法做到这一点,因此实例不知道模块的类型。
以下是一个示例:
let f (type a) (module M: Set.S with type elt = a) (pr: a -> unit) (m: M.t) =
M.iter pr m;;
M是一个由类型为a的元素构成的Set模块,pr可以用于打印类型为a的元素。下面是由此引起的错误信息(我认为不是非常清晰):
Line 1, characters 69-78:
Error: This pattern matches values of type M.t
but a pattern was expected which matches values of type 'a
The type constructor M.t would escape its scope
我试图通过考虑参数范围仅涵盖函数主体而导致问题的方式来解决这个问题,所以我将最后一个参数放在函数体内,像这样:
let f (type a) (module M: Set.S with type elt = a) (pr : a -> unit) =
fun (m : M.t) ->
M.iter pr m;;
但错误信息仍然存在:
Line 2, characters 7-16:
Error: This pattern matches values of type M.t
but a pattern was expected which matches values of type 'a
The type constructor M.t would escape its scope
那么有没有一种方法可以做到这一点?