Tuple.HashableThe difference between Hashable and Hashable_t functors is that the former's result type doesn't contain type t and the latter does. Therefore, Hashable can't be used to combine two pairs into 4-tuple. but Hashable_t can. On the other hand result of Hashable_t cannot be combined with Comparable.
example: module Four_ints = Tuple.Hashable_t (Tuple.Hashable_t (Int)(Int)) (Tuple.Hashable_t (Int)(Int))
If instead we used Hashable compiler would complain that the input to outer functor doesn't have type t.
On the other hand: module Foo = struct type t = String.t * Int.t include Tuple.Comparable (String) (Int) include Tuple.Hashable (String) (Int) end
If we used Hashable_t above, the compiler would complain that we have two types t defined.
Unfortunately, it is not possible to define just one functor that could be used in both cases.
module S1 : Hashable_sexpablemodule S2 : Hashable_sexpableinclude Ppx_sexp_conv_lib.Sexpable.S with type t := Make(S1)(S2).tval t_of_sexp : Sexplib0.Sexp.t -> Make(S1)(S2).tval sexp_of_t : Make(S1)(S2).t -> Sexplib0.Sexp.tinclude Hashable.S with type t := Make(S1)(S2).tinclude Hashable.Common with type t := Make(S1)(S2).tval compare : Make(S1)(S2).t -> Make(S1)(S2).t -> Base.Int.tval hash_fold_t : Base.Hash.state -> Make(S1)(S2).t -> Base.Hash.stateval hash : Make(S1)(S2).t -> Base.Hash.hash_valueval hashable : Make(S1)(S2).t Hashtbl.Hashable.tmodule Table : Hashtbl.S with type key = Make(S1)(S2).tmodule Hash_set : Hash_set.S with type elt = Make(S1)(S2).tmodule Hash_queue : Hash_queue.S with type key = Make(S1)(S2).t