Включить сигнатуру модуля и значение этого типа модуля в сигнатуру функции
Я просто хочу иметь простую функцию, которая является общей для Hashtbls, поэтому я написал это:
let iter_htbl (type a) (module H : Hashtbl.S with type key = a) htbl =
H.iter (fun _key _v -> ()) htbl
Что дает мне следующую ошибку:
53 | H.iter (fun _key _v -> ()) htbl
^^^^
Error: This expression has type 'a but an expression was expected of type
'b H.t
The type constructor H.t would escape its scope
А если я напишу:
let iter_htbl (type a b) (module H : Hashtbl.S with type key = a) (htbl : b H.t)
=
H.iter (fun _key _v -> ()) htbl
Новая ошибка (но почти такая же):
52 | let iter_htbl (type a b) (module H : Hashtbl.S with type key = a) (htbl : b H.t)
^^^^^^^^^^^^^^
Error: This pattern matches values of type b H.t
but a pattern was expected which matches values of type 'a
The type constructor H.t would escape its scope
Есть ли решение для того, чего я пытаюсь достичь?
Конечно, в моем простом случае я мог бы написать
let iter_htbl iter htbl =
iter (fun _key _v -> ()) htbl
Но если я хочу использовать несколько функций изH
это не полезное решение.