[GHC] #12240: Common Sense for Type Classes
GHC
ghc-devs at haskell.org
Wed Jul 6 03:01:16 UTC 2016
#12240: Common Sense for Type Classes
-------------------------------------+-------------------------------------
Reporter: Mathnerd314 | Owner:
Type: feature request | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.0.1
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
Type of failure: GHC rejects | Unknown/Multiple
valid program | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by Mathnerd314):
Replying to [comment:8 goldfire]:
> 1. You can already do what you want, if you rephrase your instance. From
the initial post:
>
> {{{#!hs
> instance (a ~ Int, b ~ Char) => C a b where ...
> }}}
>
Sure, this works for the original, and the original can also be solved
with functional dependencies (as in comment:3). Even the example in
comment:4 could be done with equality constraints, `(a ~ Int) => instance
C a Bool` and so on. The issue is the open-world problem; with such
general instance heads, you cannot extend the class to have more instances
without running into overlap problems. Whereas with my approach, instances
can still be declared; they just mean that instance resolution will fail
more often (which is already an expected side-effect of declaring
instances).
From what I can tell, there was no reason for the matching (instead of
unifying) behavior to begin with; it was just "how type class matching
worked", back in 1996. E.g. page 12 of
https://courses.cs.washington.edu/courses/cse590p/06sp/multi.pdf mentions
that matching uses one-way unification, but gives no explanation of why
two-way unification was not chosen. Then on page 13 they state that
constraints can be improved if they unify with a unique instance, but just
say "it is not yet clear if it would improve enough useful programs to be
worth the extra effort."
> Phabricator has well-written reasons why; see "Rejecting patches" on
[https://secure.phabricator.com/book/phabcontrib/article/contributing_code/
this page].
"The Phabricator upstream is Phacility, Inc. We maintain total control
over the project and roadmap. There is no democratic process, voting, or
community-driven decision making. This model is better at some things and
worse at others than a more community-focused model would be, but it is
the model we operate under."
I am not sure this describes GHC well; wiki:TeamGHC states "GHC's
development as a whole is not led by any particular group, company, or
individual."
> At the moment, the original poster has gotten other member of the
community to say that they wouldn't actively block the implementation of
your idea; I'm afraid this is hardly a ringing endorsement.
My impression is that this is better than the reaction to other
(implemented!) proposals, e.g. Foldable in the Prelude, which were
actively opposed. This issue is a rather small, dark corner of the
language, so few have the patience to discuss it. Furthermore, I have not
really elaborated on my proposal, because I don't know enough of GHC
internals to describe it accurately, so it is hard to actively support a
nebulous concept. At least a patch can be judged on its merits.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12240#comment:9>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list