Расширить модуль из Map в OCaml - PullRequest
5 голосов
/ 28 декабря 2011

У меня есть модуль StringMap, построенный функтором Map.Make с типом String:

module StringMap = Map.Make(String)

Помимо обычных операций, предоставляемых Map, я хотел бы добавить больше определений в этот модуль, например, my_own_function, чтобы я мог вызвать StringMap.my_own_function. Кто-нибудь знает, где я должен определить этот вид функций и их подпись?

1 Ответ

9 голосов
/ 28 декабря 2011

Вы можете использовать ключевое слово include внутри нового модуля, чтобы добавить все те же функции.Это также было расширено до подписи в OCaml 3.12 .

module StringMap =
    struct
        include Map.Make(String)
    end

Если вы хотите получить доступ к структуре карты, вам нужно будет добавить Obj.magic или %identity специальная внешняя функция.Переопределение типа должно быть точным, поскольку проверка типов не выполняется,

module Make (Ord : Map.OrderedType) =
    struct
        include Map.Make(Ord)

        type 'a impl = Empty 
                     | Node of 'a impl * key * 'a * 'a impl * int

        external impl_of_t : 'a t -> 'a impl = "%identity"
        external t_of_impl : 'a impl -> 'a t = "%identity"

        let cardinal map =
            let rec cardinal = function
                | Empty -> 0
                | Node(l,_,_,r,_) -> cardinal l + 1 + cardinal r
            in
            cardinal (impl_of_t map)

    end
...