Hashable is already Equatable.
Concatenation is right-associative.
Install path is @rpath.
Implement reduce over languages.
Debug builds are marked as such.
Add a Testable protocol.
Move reduce into the Language type.
Test reduce.
Tidier.
Implement Hashable with a fixpoint.

This still doesn’t terminate, because memoizing the language takes the
hash of the language, and that calls out to computeHash() anew, and
*that* calls fixpoint, which makes a new dictionary, i.e. it’s never
given an opportunity to look up.
Tidy the def’n of fixpoint.
A convenience to get ObjectIdentifiers for instances.
Hashable pairs of instances.
Move String : Printable into its own file.
Delete reduce over languages.
Define languages via a recursion type parameter.
Add a protocol for identifiable objects.
Clarify docs.
Fix over identities.
Implement a two-element fixpoint.