Ocaml值与模块和签名中的参数化类型不匹配

我正在尝试在 http://okmij.org/ftp/tagless-final/nondet-effect.html#no-functor中执行一个扩展练习,并用’a repr替换int_t类型.在尝试这样做时,我坚持以下错误:

Values do not match:
  val cons : '_a repr -> '_a list_t -> '_a list_t
is not included in
  val cons : 'a repr -> 'a list_t -> 'a list_t

我对cons的实现看起来像

let cons: 'a repr -> 'a list_t -> 'a list_t =
  liftm2 (fun h t -> h::t)

这绝对是正确的类型.为什么这些明显相同的类型不兼容?

最佳答案 做一个最小的例子帮我解决了这个问题!

我能够将失败的案例减少到这个:

module type Test = sig
  type 'a t
  val id: 'a t -> 'a t
end

module TestT: Test = struct
  type 'a t = 'a

  let id_maker () x = x
  let id: 'a t -> 'a t =
    id_maker ()
end

这表明我是value restriction的受害者.
在this other stack overflow question中有类似的问题,但我被模块错误消息误导了.
我通过改变来修复问题

let cons: 'a repr -> 'a list_t -> 'a list_t =
  liftm2 (fun h t -> h::t)

let cons: 'a repr -> 'a list_t -> 'a list_t =
  fun h t -> liftm2 (fun h t -> h::t) h t
点赞