The 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.
include Hashable.S with type t := t
include Hashable.Common
include sig ... end
val compare : t ‑> t ‑> Core_kernel__.Import.int
val hash_fold_t : Base.Hash.state ‑> t ‑> Base.Hash.state
val hash : t ‑> Base.Hash.hash_value
val hashable : t Hashtbl.Hashable.t
module Hash_set : Hash_set.S with type elt = t
module Hash_queue : Hash_queue.S with type Key.t = t