
#13153: Several Traversable instances have an extra fmap -------------------------------------+------------------------------------- Reporter: dfeuer | Owner: dfeuer Type: bug | Status: new Priority: normal | Milestone: 8.4.1 Component: Core Libraries | Version: 8.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by dfeuer): Replying to [comment:5 RyanGlScott]:
{{{#!hs newtype ZipList a = ZipList [a] deriving newtype (Functor, Foldable) deriving unsafenewtype (Traversable) }}}
Interesting. I believe this is probably safe even if the underlying `Applicative` and `Traversable` are bogus, thanks to polymorphism. We are coercing `f (t b)` to `f (u b)`. The usual concern with such a coercion is that `f` could have an index rather than a parameter, so matching on the result of the coercion could falsely reveal that `t ~ u`. But `traverse` can only construct `f` values using `pure`, `<*>`, and the given function. Of those, only the given function could produce values carrying evidence. But they can carry evidence only about `b`, not about `t`. So it looks like coercing the result of `traverse` to a representationally identical container with the same element type is ''probably'' okay.
Granted, this is a separate hack to get around the fact that we don't have higher-kinded roles yet, but it's (IMO) much nicer to use than having to manually inline the definition of `traverse` like you demonstrated above.
Can you explain how higher-kinded roles would help? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13153#comment:8 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler