
#7989: "No constructor has all these fields" message can be improved ---------------------------------+------------------------------------------ Reporter: akio | Owner: Type: feature request | Status: patch Priority: normal | Milestone: Component: Compiler | Version: 7.7 Keywords: | Os: Unknown/Multiple Architecture: Unknown/Multiple | Failure: Other Difficulty: Unknown | Testcase: Blockedby: | Blocking: Related: | ---------------------------------+------------------------------------------ Comment(by akio): I updated the patch. Replying to [comment:7 simonpj]:
OK.... It's not easy to understand that code! Maybe it would be worth a few more named intermediate values, with types, and a comment?
I did this.
You could produce a very big set when a very small set exists, couldn't
you? Yes, the size of the set is only bounded by the number of constructors.
Could you ameliorate that as follows? Use `T` to mean the data type of
* Sort the `membership` list in order of increasing number of `True` fields. So the earlier fields `f` in the list have few `T` constructors
* Now a field with a different type will be right at the front of the
the first field in `rbinds`. that have field `f`. list.
* And the `(&&)` process will terminate more quickly because of all the `False` items.
I implemented this. However I'm afraid that the worst-case behavior of the algorithm hasn't changed much. Given a datatype with 2N constructors and 2N fields, it can find a set of N fields even though there is one with just 2 fields. (an example is when the constructor ```i``` has the field ```j``` iff ```mod (i + j) (2*N) < N```) -- Ticket URL: http://hackage.haskell.org/trac/ghc/ticket/7989#comment:8 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler