[GHC] #10447: DeriveFoldable rejects instances with constraints in last argument of data type
GHC
ghc-devs at haskell.org
Wed May 27 23:47:46 UTC 2015
#10447: DeriveFoldable rejects instances with constraints in last argument of data
type
-------------------------------------+-------------------------------------
Reporter: RyanGlScott | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.10.1
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
Type of failure: GHC rejects | Unknown/Multiple
valid program | Test Case:
Blocked By: | Blocking:
Related Tickets: #8678 | Differential Revisions:
-------------------------------------+-------------------------------------
Comment (by RyanGlScott):
The code that I would expect {{{DeriveFoldable}}} to derive for {{{T1}}},
{{{T2}}}, or {{{T3}}} would be:
{{{#!hs
instance Foldable T where
foldr f z (MkT a) = f a z
foldMap f (MkT a) = f a
}}}
which is the same code that you would get for {{{data T a = MkT a deriving
Foldable}}}. I don't believe this would require any change to the
{{{deriving Foldable}}} algorithm (but I'm not intimately familiar with
the implementation details).
I agree that it would be nice to have more documentation on the algorithms
themselves. I gained a better intuition for the
[http://git.haskell.org/ghc.git/blob/9f968e97a0de9c2509da00f6337b612dd72a0389:/compiler/typecheck/TcGenDeriv.hs#l1476
Functor],
[http://git.haskell.org/ghc.git/blob/9f968e97a0de9c2509da00f6337b612dd72a0389:/compiler/typecheck/TcGenDeriv.hs#l1725
Foldable], and
[http://git.haskell.org/ghc.git/blob/9f968e97a0de9c2509da00f6337b612dd72a0389:/compiler/typecheck/TcGenDeriv.hs#l1800
Traversable] algorithms by reading the comments in {{{TcGenDeriv.hs}}}.
For example, here's a somewhat formal description of how {{{deriving
Foldable}}} works:
{{{
The cases are:
$(foldr 'a 'b) = \x z -> z -- when b does not contain a
$(foldr 'a 'a) = f
$(foldr 'a '(b1,b2)) = \x z -> case x of (x1,x2) -> $(foldr 'a 'b1)
x1 ( $(foldr 'a 'b2) x2 z )
$(foldr 'a '(T b1 b2)) = \x z -> foldr $(foldr 'a 'b2) z x -- when a
only occurs in the last parameter, b2
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10447#comment:6>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list