
#16173: Move `Data.Profunctor` from `profunctors` package to `base` -------------------------------------+------------------------------------- Reporter: chshersh | Owner: (none) Type: feature | Status: new request | Priority: normal | Milestone: Component: Core | Version: 8.6.3 Libraries | Keywords: base, | Operating System: Unknown/Multiple profunctor, QuantifiedConstraints | Architecture: | Type of failure: None/Unknown Unknown/Multiple | Test Case: | Blocked By: Blocking: | Related Tickets: #14767 Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- `Contravariant` was added in GHC 8.6. * https://hackage.haskell.org/package/base-4.12.0.0/docs/Data-Functor- Contravariant.html `Profunctor` also looks like fundamental abstraction to be worth considering adding to `base`. Having both `Profunctor` and `Choice` typeclasses in the `base` library will also allow to write `microprism` package similar to `microlens`. Prisms often turns to be very useful since they allow to work nicely with sum types. {{{#!hs type Prism s t a b = forall p f. (Choice p, Applicative f) => p a (f b) -> p s (f t) }}} Additional context for this ticket from Reddit: * https://www.reddit.com/r/haskell/comments/8v53cb/announce_ghc_861alpha1_avai... It was proposed on Reddit to use `QuantifiedConstraints` for `Profunctor`. I'm not quite fluent with `QuantifiedConstraints`, but I think this may looks like this (mostly copy-pasting code from `profunctors` package): {{{#!hs {-# LANGUAGE QuantifiedConstraints #-} class (forall a . Functor (p a)) => Profunctor p where {-# MINIMAL dimap | (lmap, rmap) #-} dimap :: (a -> b) -> (c -> d) -> p b c -> p a d dimap f g = lmap f . rmap g lmap :: (a -> b) -> p b c -> p a c lmap f = dimap f id rmap :: (b -> c) -> p a b -> p a c rmap = dimap id instance Profunctor (->) where dimap ab cd bc = cd . bc . ab lmap = flip (.) rmap = (.) }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/16173 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler