在我的代码中,我有一个名为
我正在实现一个围绕
我需要定义一个类似于以下内容的函数:
我该如何表达这种类型约束?
CouchDB.ctx
的数据库访问上下文,提供基本的读写操作。我的应用程序中的各种模块使用该类扩展其他功能,例如Async.ctx
。我正在实现一个围绕
Source
模块包装的Cache
模块。Cache
模块函数需要一个上下文参数,并操作数据库。然后,一些调用将随着上下文转发到Source
模块。我需要定义一个类似于以下内容的函数:
module CouchDB = struct
class ctx = object
method get : string -> string option monad
method put : string -> string -> unit monad
end
end
module AsyncDB = struct
class ctx = object
inherit CouchDB.ctx
method delay : 'a. float -> (ctx -> 'a monad) -> 'a monad
end
end
module type SOURCE = sig
class ctx = #CouchDB.ctx (* <-- incorrect *)
type source
val get : source -> ctx -> string monad
end
module Cache = functor(S:SOURCE) -> struct
class ctx = S.ctx
type source = S.source
let get source ctx =
bind (ctx # get source) (function
| Some cache -> return cache
| None ->
bind (S.get source ctx)
(fun data -> bind (ctx # put source data)
(fun () -> return data))
end
module SomeSource = struct
class ctx = AsyncDB.ctx
type source = string
let get s ctx =
ctx # async 300 (some_long_computation s)
end
module SomeCache = Cache(SomeSource)
问题在于我无法表达Source
模块使用的上下文应该是CouchDB.ctx
的子类型。以上代码会返回以下错误:
A type variable is unbound in this type declaration.
In type #CouchDB.ctx as 'a the variable 'a is unbound
我该如何表达这种类型约束?
SOURCE
签名很好奇。在我看来,声明应该是module type SOURCE = sig class ctx : object inherit CouchDB.ctx end (* ... *) end
;这不符合你的需求吗? - user593999