
Currently in simplifyDeriv, we are using the function simplifyWantedsTcM to simplify the constraints, which seemed to work well back when all of our deriving-related constraints were simple wanteds. But now we're
2. When you say "just emit this implication": `forall d. CX => RC`.. To tie it back to your example in comment:10, are you proposing to emit
#9821: DeriveAnyClass support for higher-kinded classes + some more comments -------------------------------------+------------------------------------- Reporter: dreixel | Owner: dreixel Type: bug | Status: patch Priority: normal | Milestone: 8.2.1 Component: Compiler | Version: 7.9 Resolution: | Keywords: Generics Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: #5462, #9968, | Differential Rev(s): Phab:D2961 #12144 | Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): Further clarifications throwing implication constraints into the mix. Are you proposing to replace the use of simplifyWantedsTcM entirely with something la simplifyInfer? Are you proposing to invoke a simplifyInfer-like function after simplifyWantedsTcM? Something else? Something like `simplifyInfer`, but simpler. Call `simplifyWanteds`; then `approximateWC`; then `mkMinimalBySCs`; then emit the residual constraint as above. this? {{{ forall d. Show d => ((forall b. () => (Show d, C d b)) ^ (forall . Eq (Maybe d) => (Ord d, Show d)) }}}
That is, letting {{{ CX = (Show d) RC = ((forall b. () => (Show d, C d b)) ^ (forall . Eq (Maybe d) => (Ord d, Show d)) }}}
I see that there is a function emitImplication, which appears to modify
Maybe you meant comment:14. Then yes. (There are several related examples in comment:14, so I'm not sure precisely which one you mean. the state of TcM. But I'm still unsure of when the error message involving (C d b) is supposed to be thrown. That is, what specific action causes the typechecker to see the bogus (C d b) and complain? It's the `simplifyTop` called right at the top level, in `TcRnDriver`. Most constraint solving is done by this single call to `simplifyTop`; only when we MUST solve eagerly (as here, to get CX) do we call the solver. Usually we just toss the unsolved constraint into the monad and solve it right at the end. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9821#comment:17 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler