124 | | where `Eq#` is a data constructor with a single, unboxed, zero-width field of type `(a ~# b)`. See `TysWiredIn.eqTyCon`. |

| 124 | where `Eq#` is a data constructor with a single, unboxed, zero-width field of type `(a ~# b)`. See `TysWiredIn.eqTyCon`. [[BR]][[BR]] |

| 125 | The reason we have both boxed and unboxed forms of equality constraint is that |

| 126 | * Boxed equality constraints `(a~b)` can be treated uniformly with all other constraints. This is a big win in the type checker and, more particularly, in sitautions like |

| 127 | {{{ |

| 128 | type Bla a b = (Eq a, a~b) |

| 129 | }}} |

| 130 | We have no way to deal with a tuple with some boxed and some unboxed constraints.[[BR]][[BR]] |

| 131 | * Unboxed equality constraints `(a~#b)` can be implemented much more efficiently at runtime; they take no space, and are passed in zero-width registers (of which we have many!). |