Tôi đã tình cờ gặp một vấn đề OCaml khá đơn giản, nhưng tôi dường như không thể tìm thấy một giải pháp thanh lịch. Tôi đang làm việc với các hàm được áp dụng cho các mô-đun tương đối đơn giản (chúng thường định nghĩa một kiểu và một vài hàm trên kiểu đó) và mở rộng các mô-đun đơn giản đó bằng cách thêm các hàm, kiểu và mô-đun phức tạp hơn. Một phiên bản đơn giản sẽ là:Mô-đun và trường ghi
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
Không cần để cung cấp cho các mô-đun đơn giản một tên bởi vì tất cả chức năng của nó hiện diện trong các mô-đun mở rộng, và các chức năng trong module đơn giản được tạo ra bởi camlp4 dựa trên loại . Việc sử dụng thành ngữ của những functors là:
module Int = Complex(struct
type t = int
end)
Vấn đề xuất hiện khi tôi đang làm việc với các bản ghi:
module Point2D = Complex(struct
type t = { x : int ; y : int }
end)
let (Some location) = Point2D.read db "location"
Có vẻ là không có cách nào đơn giản truy cập vào các lĩnh vực x
và y
định nghĩa ở trên từ bên ngoài mô-đun Point2D
, chẳng hạn như location.x
hoặc location.Point2D.x
. Làm thế nào tôi có thể đạt được điều này?
EDIT: theo yêu cầu, đây là một ví dụ rất nhỏ hoàn toàn có hiển thị các vấn đề:
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 *)
Viết mã có thể biên dịch rất nhiều sẽ giúp nhận được câu trả lời có tính tổng hợp. –