Включить сигнатуру модуля и значение этого типа модуля в сигнатуру функции

Я просто хочу иметь простую функцию, которая является общей для 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это не полезное решение.

0 ответов

Другие вопросы по тегам