मेरे कोड में, मेरे पास डेटाबेस पहुंच संदर्भ है जो CouchDB.ctx
नामक प्राथमिक पढ़ने/लिखने के संचालन प्रदान करता है। मेरे आवेदन में विभिन्न मॉड्यूल तब उस वर्ग को अतिरिक्त कार्यक्षमता के साथ बढ़ाते हैं, जैसे Async.ctx
।ओकैमल: हस्ताक्षर में टाइप बाधाएं
मैं Cache
मॉड्यूल को कार्यान्वित कर रहा हूं जो Source
मॉड्यूल के आसपास लपेटा गया है। Cache
मॉड्यूल फ़ंक्शन एक संदर्भ तर्क लेते हैं और डेटाबेस में हेरफेर करते हैं। कुछ कॉल को संदर्भ के साथ Source
मॉड्यूल पर अग्रेषित किया जाता है।
मैं इस की तर्ज पर एक functor निर्धारित करने होंगे:
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 = sig वर्ग ctx होना चाहिए: ऑब्जेक्ट को CouchDB.ctx end (* ... *) end' प्राप्त होता है; क्या आपको ऐसा करने की ज़रूरत नहीं है? –