2012-10-15 21 views
6

Tôi đã thực hiện một functor cho bộ định dạng có thể, như sau:Mở rộng OCaml Maps để formattable Maps

module type POrderedType = 
    sig 
    type t 
    val compare : t -> t -> int 
    val format : Format.formatter -> t -> unit 
    end 

module type SET = 
    sig 
    include Set.S 
    val format : Format.formatter -> t -> unit 
    end 

module MakeSet (P : POrderedType) : SET with type elt = P.t 

Thực hiện điều này rất đơn giản:

module MakeSet (P : OrderedType) = 
    struct 
    include Set.Make(P) 

    let format ff s = 
     let rec format' ff = function 
     | [] ->() 
     | [v] -> Format.fprintf ff "%a" format v 
     | v::tl -> Format.fprintf ff "%a,@ %a" format v format' tl in 
     Format.fprintf ff "@[<4>%[email protected]]" format' (elements s) 
    end 

tôi muốn làm một cái gì đó tương tự với bản đồ. POrderedType là tốt cho các phím, nhưng tôi cần một kiểu đơn giản hơn cho các giá trị:

module type Printable = 
    sig 
    type t 
    val format : Format.formatter -> t -> unit 
    end 

Sau đó, tôi muốn làm một cái gì đó tương tự như những gì tôi đã làm cho bộ, nhưng tôi chạy vào vấn đề sau đây. Giá trị Map.S có loại +'a t. Tôi không thể tìm ra cách để bao gồm định nghĩa Map.S trong khi hạn chế 'a thành Printable.t.

module MakeMap (Pkey : POrderedType) (Pval : Printable) : 
    MAP with type key = Pkey.t and type 'a t = 'a t constraint 'a = Pval.t 

Có cách nào để làm những gì tôi muốn mà không sao chép toàn bộ chữ ký của Bản đồ bằng tay: một cái gì đó như sau (bỏ qua thực tế là nó là bất hợp pháp) Những gì tôi muốn là?

Trả lời

3

Tôi nghĩ cách sạch nhất để đề xuất chức năng in cho bản đồ đa hình là làm cho tham số chức năng in bản đồ trên chức năng in giá trị. Bạn có thể nghĩ về nó theo cách này:

  • loại functor xác định được định nghĩa ở cấp functor, vì vậy cung cấp chức năng cho họ là tốt nhất thực hiện bằng cách thêm các thông số functor mới (hoặc làm phong phú thêm những cái hiện có)

  • loại tham số đang bị ràng buộc (tổng quát) ở mức giá trị, do đó cung cấp các chức năng cho họ được thực hiện tốt nhất bằng cách thêm các thông số mới với giá trị

Trong OCaml, tiện lợi có xu hướng làm cho mọi người ủng hộ đa hình tham số trên functorization khi possi ble. Functorization là đôi khi cần thiết để thực thi một số loại an toàn (ở đây nó được sử dụng để đảm bảo rằng các bản đồ trên các chức năng so sánh khác nhau có loại không tương thích), nhưng nếu không mọi người thay vì cố gắng để có đa hình. Vì vậy, bạn đang thực sự trong tình huống may mắn ở đây.

Nếu bạn thực sự muốn có một functor sản xuất bản đồ đơn sắc, tốt, tôi sợ bạn sẽ phải sao chép toàn bộ giao diện bản đồ và điều chỉnh nó trong trường hợp momonorphic - nó không có nhiều công việc.