[GHC] #8021: Multiple constraint classes - the alternative to superclass
GHC
ghc-devs at haskell.org
Fri Jul 12 22:14:59 CEST 2013
#8021: Multiple constraint classes - the alternative to superclass
-------------------------------------+------------------------------------
Reporter: wvv | Owner:
Type: feature request | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.6.3
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture: Unknown/Multiple
Type of failure: None/Unknown | Difficulty: Unknown
Test Case: | Blocked By:
Blocking: | Related Tickets:
-------------------------------------+------------------------------------
Comment (by wvv):
(I) We don't change the type system.
(II) We have some problems with the type inference. Haskell have 2
solution if it has an ambiguity:
1) The error. You must add type signature
Functions
{{{
foo :: Monoid [a] -> [a] -> [a] -> [a]
bar :: (Arrow a, ArrowPlus a, ArrowZero a) => Monoid a => a b c -> a b c
-> a b c
}}}
2) Default meanings. For example, use class in constraint with minimum
dependences.
(III) A lot of work for the type checker.
Let we have 2 classes:
{{{
class C1 => C a0 a1 .. an where
data ...
type ...
f1 :: b1f1 -> b2f2 -> .. -> bn'f1
f2 :: b1f2 -> b2f2 -> .. -> bn''f2
..
fu :: b1fu -> b2fu -> .. -> bn'''fu
class C2 => C d0 d1 .. dm where
data ...
type ...
g1 :: b1g1 -> b2g2 -> .. -> bm'g1
g2 :: b1g2 -> b2g2 -> .. -> bm''g2
..
gu' :: b1gu' -> b2gu' -> .. -> bm'''gu'
}}}
Lows:
1) C1 =/= C2 -- constraint must be different
2) n == m -- number of parameters must be the same
3) u == u' -- number of functions must be the same
4) forall i . s(fi) == s(gi) -- names of functions must be the same
5) forall i. n'{i} == m'{i} -- number of arguments for each functions
must be the same
6) forall i j. (bifj :: *) & (bigj :: *) | (bifj :: k) & (bigj :: k) --
corresponding arguments must have the same kind
That's all!
- forall i. ai :: kia , di :: kid, kia =?= kib - class parameters could
have different kinds
- datas and types of C1=>C and C2=>C could be different (by number, kind
and name)
Uses in signature:
{{{
foo :: C1 => C a => ...
bar :: C2 => C b => ...
baz :: C d => .... <<=|=>> baz :: () => C d => ...
}}}
We use classes like instances of meta-classes
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8021#comment:9>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list