I face a situation where a record is given a weak polymorphic type and I am not sure why.
Here is a minimized example
module type S = sig
type 'a t
val default : 'a t
end
module F (M : S) = struct
type 'a record = { x : 'a M.t; n : int }
let f = { x = M.default; n = (fun x -> x) 3 }
end
Here f
is given the type '_weak1 record
.
There are (at least) two ways to solve that problem.
- The first one consists in using an auxiliary definition for the function application.
let n = (fun x -> x) 3 let f = { x = M.default; n }
- The second one consists in declaring the type parameter of
t
as covariant.module type S = sig type +'a t val default : 'a t end
What I find strange is that the function application is used to initialize the field of type int
that has no link at all with the type variable 'a
of type t
. And I also fail to see why declaring 'a
as covariant suddenly allows to use arbitrary expressions in this unrelated field without losing polymorphism.