All elements of a set or bag are candidates for comparison or hashing, as are all keys of a map.
Range values of a map are not normally compared or hashed, but they are if the map as a whole is
compared or hashed, respectively; this is the case in which the provided val-compare-fn and
val-hash-fn come into play.
Seq elements are not normally compared or hashed, but again, they are if the seq as a whole is
compared or hashed. In this case, if you don’t want the containing collection to simply use
compare or hash-value, you must give it a compare and/or hash function that compares
the seqs in whatever way you want.
I said in the previous chapter that FSet requires that a list, string, or vector used in an FSet collection will not subsequently be modified. This is not quite right; objects that are not compared or hashed, according to the above rules, may still be mutated. For example, you could have a seq of vectors, or a map whose range values are vectors, and you could mutate those vectors, as long as the seq or map is not itself compared or hashed.