
#8767: Add rules involving `coerce` to the libraries -------------------------------------+------------------------------------- Reporter: nomeata | Owner: Type: task | Status: new Priority: normal | Milestone: 7.10.1 Component: | Version: 7.9 libraries/base | Keywords: Resolution: | Architecture: Unknown/Multiple Operating System: | Difficulty: Unknown Unknown/Multiple | Blocked By: 8718 Type of failure: | Related Tickets: #2110 None/Unknown | Test Case: | tests/simplCore/should_run/T2110.hs| Blocking: | Differential Revisions: | -------------------------------------+------------------------------------- Comment (by dmcclean): I knew about the representational parameter part, that's why I thought maybe it was possible to only generate the instance if `f` has a representational parameter. i.e. it's not one once-and-for-all instance for all functors, instead it's "magically" (as the current coercible instances are) generated once at each functor type with the branching between `fmap coerce` and `coerce` happening after considering the concrete type of `f`. The bit about the lawfulness I had missed. I don't understand how it results in `Coercible (f a) (f b)` with no context, even if it is once-and-for-all and not the magical akin-to-an- axiom-schema way, but I'm sure you're correct. It seems like the unlawful functor desideratum is very difficult to handle because we don't have a way to have a qualified type that is qualified by whether or not the `Functor` is lawful. One possible thing would be to have an {-# UNLAWFUL #-} pragma, and when you are magically generating instances you branch three ways instead of 2. (Possibly such a pragma could allow more aggressive optimizations in other cases too, with an opt out for 'criminals'?) 1) If the role is representational and there's no unlawful pragma, you generate `coerce`. 2) If there's no unlawful pragma, but the role is something other than representational you generate `fmap coerce`. 3) If there's an unlawful pragma, you generate `error "Attempt to coerce through unlawful functor Foo declared at line ..."`, on the grounds that `error` is not pretty, but neither is unlawfulness. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8767#comment:21 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler