
#15470: Record projections with ambiguous types -------------------------------------+------------------------------------- Reporter: sweirich | Owner: (none) Type: feature request | Status: new Priority: normal | Milestone: 8.8.1 Component: Compiler | Version: 8.4.3 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 simonpj): I thought that visible type applications would work too, so I tried it (diff below). Alas it turns out that we give record selectors ''nested'' forall types. For example from {{{ data T m = MkT { fld :: forall a. m a -> m a } }}} we get the selector: {{{ fld :: forall m. T m -> (forall a. m a -> m a) }}} So we can't use scoped type variables from the signature to instantiate in the RHS, ike this {{{ fld :: forall m. T m -> (forall a. m a -> m a) fld (MkT x) = x @ a -- No }}} Bother. Maybe we can change this assumption, and put all the foralls (and constraints) at the top of record selectors? I'm not sure of the consequences of doing so. The choice is made in the definition of `sel_ty` in `TcTyDecls.mkOneRecordSelector`. It affects user code. For example, do we write `fld @IO r @Int` or `fld @IO @Int r`? So it's be a breaking change. I'm not sure I see any other solution, alas. Richard, Mr VTA? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15470#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler