
#13403: Derive instances (Applicative, Monad, ...) for structures lifted over functors -------------------------------------+------------------------------------- Reporter: Iceland_jack | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by Iceland_jack): Thanks for taking the time to respond to my proposals Replying to [comment:2 RyanGlScott]:
This feels extremely //ad hoc// and not nearly formalized enough to where I'd be comfortable with it.
At least it gets a reaction :) the proposal was but we can go into the direction of [https://hackage.haskell.org/package/base-4.9.1.0/docs/GHC- Generics.html#t:Rep Generic's Rep]
I have no idea how you could teach GHC to recognize "product types"
It's not just for product types, I should have made myself more clear but I didn't want to complicate the proposal. This should work for our entire polynomial arsenal, `Sum`, `Product`, `Identity`, `Const _`, when we get to weirder things like [https://hackage.haskell.org/package/bifunctors-5.4.1/docs/Data-Bifunctor- Biff.html Biff] things start to collide. Maybe it's a matter of picking a comfortable subset.
`data Product f g h a = Product (f (g (f a))) (h (f (g a)))`?
That could be encoded as ↓ and we can still derive a whole host of instances {{{#!hs infixr 9 · type (·) = Compose newtype P f g h a = P (Product (f · g · f) (h · f · g) a) deriving (Functor, Foldable, Traversable, Applicative, Alternative, Contravariant) }}} In any case it could be implemented incrementally.
What if there are constants like `data Product a = Product Int a`?
They could always be rewritten as (I changed `Int` to `String` to get that `Applicative` instance) {{{#!hs newtype Q a = Q (Product (Const String) Identity a) deriving (Functor, Foldable, Traversable, Applicative) }}}
* `newtype Compose f g a = Compose (f (g a))` * `data Proxy a = Proxy`
`Compose` and `Proxy` would likely be primitives in what ever subset of types we support. Are there other discussions about something similar? Or is this the first time this is proposed. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13403#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler