मैंने एक साधारण ओकैमल समस्या में ठोकर खाई है, लेकिन मुझे एक सुरुचिपूर्ण समाधान नहीं मिल रहा है। मैं उन मज़ेदारों के साथ काम कर रहा हूं जो अपेक्षाकृत सरल मॉड्यूल पर लागू होते हैं (वे आमतौर पर उस प्रकार पर एक प्रकार और कुछ कार्यों को परिभाषित करते हैं) और अतिरिक्त जटिल कार्यों, प्रकारों और मॉड्यूल जोड़कर उन सरल मॉड्यूल का विस्तार करते हैं। एक सरलीकृत संस्करण होगा:मॉड्यूल और रिकॉर्ड फ़ील्ड्स
module type SIMPLE = sig
type t
val to_string : t -> string
val of_string : string -> t
end
module Complex = functor (S:SIMPLE) -> struct
include S
let write db id t = db # write id (S.to_string t)
let read db id = db # read id |> BatOption.map S.of_string
end
क्योंकि इसके सभी कार्यक्षमता विस्तारित मॉड्यूल में मौजूद है सरल मॉड्यूल एक नाम देने के लिए कोई जरूरत नहीं है, और सरल मॉड्यूल में कार्य करता है प्रकार के आधार पर camlp4 द्वारा उत्पन्न कर रहे । इन functors का मुहावरेदार इस्तेमाल होता है:
module Int = Complex(struct
type t = int
end)
समस्या प्रकट होता है जब मैं रिकॉर्ड के साथ काम कर रहा हूँ:
module Point2D = Complex(struct
type t = { x : int ; y : int }
end)
let (Some location) = Point2D.read db "location"
वहाँ से ऊपर परिभाषित x
और y
क्षेत्रों तक पहुँचने का कोई आसान तरीका प्रतीत हो रहा है Point2D
मॉड्यूल के बाहर, जैसे location.x
या location.Point2D.x
। इसे कैसे प्राप्त किया जा सकता है?
संपादित: के रूप में अनुरोध किया है, यहाँ एक पूरा कम से कम उदाहरण है कि इस मुद्दे को प्रदर्शित करता है है:
सभी कीmodule type TYPE = sig
type t
val default : t
end
module Make = functor(Arg : TYPE) -> struct
include Arg
let get = function None -> default | Some x -> (x : t)
end
module Made = Make(struct
type t = {a : int}
let default = { a = 0 } (* <-- Generated by camlp4 based on type t above *)
end)
let _ = (Made.get None).a (* <-- ERROR *)
कंपिल करने योग्य कोड पोस्ट करने से संकलित उत्तर प्राप्त करने में बहुत मदद मिलेगी। –