 <p>(EDIT: CKoenig has a nice answer.)</p> <p>Hm, I didn't immediately see a way to do this either.</p> <p>Here's a non-type-safe solution that might provide some crazy inspiration for others. </p> <pre><code>open System.Collections.Generic module Dict = type Dictionary&lt;'K, 'V&gt; with member this.Difference&lt;'K2, 'T when 'K2 : equality&gt;(that:Dictionary&lt;'K2, 'T&gt;) = let dict = Dictionary&lt;'K2,'V&gt;() for KeyValue(k, v) in this do if not (that.ContainsKey(k |&gt; box |&gt; unbox)) then dict.Add(k |&gt; box |&gt; unbox, v) dict open Dict let d1 = Dictionary() d1.Add(1, "foo") d1.Add(2, "bar") let d2 = Dictionary() d2.Add(1, "cheese") let show (d:Dictionary&lt;_,_&gt;) = for (KeyValue(k,v)) in d do printfn "%A: %A" k v d1.Difference(d2) |&gt; show let d3 = Dictionary() d3.Add(1, 42) d1.Difference(d3) |&gt; show let d4 = Dictionary() d4.Add("uh-oh", 42) d1.Difference(d4) |&gt; show // blows up at runtime </code></pre> <p>Overall it seems like there may be no way to unify the types <code>K</code> and <code>K2</code> without also forcing them to have the same equality constraint though...</p> <p>(EDIT: seems like calling into .NET which is equality-constraint-agnostic is a good way to create a dictionary in the absence of the extra constraint.)</p>