
#15833: Typed template haskell quote fails to typecheck when spliced due to an ambiguous type variable -------------------------------------+------------------------------------- Reporter: mpickering | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.6.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 mpickering): If I inline both recursive calls to `execOp` then the code in `Compiler` fails to typecheck. {{{ 26 execOp :: Monoid m => Operator -> QTExp (IO m) -> QTExp (IO m) 27 execOp op yld = 28 case op of 29 Scan -> 30 while [|| \r -> ($$(yld) >> r)||] 31 Join left right -> 32 while [|| \r -> $$(while [|| \r -> ($$(yld) >> r) ||]) >> r ||] }}} {{{ Compiler.hs:32:26: error: • Could not deduce (Monoid a0) arising from a use of ‘while’ from the context: Monoid m bound by the type signature for: execOp :: forall m. Monoid m => Operator -> QTExp (IO m) -> QTExp (IO m) at Compiler.hs:26:1-62 The type variable ‘a0’ is ambiguous These potential instances exist: instance Monoid a => Monoid (IO a) -- Defined in ‘GHC.Base’ instance Monoid Ordering -- Defined in ‘GHC.Base’ instance Semigroup a => Monoid (Maybe a) -- Defined in ‘GHC.Base’ ...plus 7 others (use -fprint-potential-instances to see them all) • In the expression: while [|| \ r -> ($$(yld) >> r) ||] In the Template Haskell splice $$(while [|| \ r -> ($$(yld) >> r) ||]) In the first argument of ‘(>>)’, namely ‘$$(while [|| \ r -> ($$(yld) >> r) ||])’ | 32 | while [|| \r -> $$(while [|| \r -> ($$(yld) >> r) ||]) >> r ||] | }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15833#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler