我尝试在http://okmij.org/ftp/tagless-final/nondet-effect.html#no-functor中执行其中一项扩展练习,并将int_t
类型替换为'a repr
。在尝试这样做时,我坚持以下错误:
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)
绝对是正确的类型。为什么这些明显相同的类型不兼容?
答案 0 :(得分:2)
制作一个最小的例子帮助我解决了这个问题! 我能够将失败的案例减少到这个:
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