
#12183: Do not display global bindings with -fno-max-relevant-binds -------------------------------------+------------------------------------- Reporter: ezyang | Owner: Type: feature request | Status: new Priority: normal | Milestone: Component: Compiler (Type | Version: 8.0.1 checker) | 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: | -------------------------------------+------------------------------------- Description changed by ezyang: @@ -54,1 +54,2 @@ - these anyway.) + these anyway.) So really, to see all local bindings I just want to set + `-fmax-relevant-binds=100000` (i.e., to a large number.) @@ -56,3 +57,6 @@ - Thus, I propose that `-fmax-relevant-binds=N` be changed to apply to - GLOBAL bindings only, and that GHC should unconditionally print all local - bindings. Furthermore, I suggest that by default `-fmax-relevant-binds=0`. + So, I think there should be another flag `-frelevant-global-binds` which + triggers display of global relevant bindings, making `-fno-max-relevant- + binds` equivalent to `-fmax-relevant-binds=BIGNUM`; i.e., it does NOT + report global bindings. I don't know if the error message should mention + `-frelevant-global-binds` by default, but for now I would say it + shouldn't. New description: Presently, "Relevant bindings" messages (e.g., from holes) will attempt to report all local bindings, and relevant global bindings (by some heuristic), up to the number of bindings specified by `-fmax-relevant- binds=N`. For example, here is an error I recently had with a small number of relevant bindings: {{{ Productive.hs:162:16: error: • Found hole: _ :: Par (D k0 (Stream k0 b)) Where: ‘k0’ is an ambiguous type variable ‘b’ is a rigid type variable bound by the type signature for: maapM :: forall a b. (a -> Par b) -> (forall (k :: Clock). Stream k a) -> Par (Forall1 Stream b) at Productive.hs:155:10 • In the second argument of ‘(<$>)’, namely ‘_’ In a stmt of a 'do' block: Cons b <$> _ In the expression: do { (a, s') <- deStreamCons s; b <- f a; b' <- f (scar (unForall1 s')); Cons b <$> _ } • Relevant bindings include b' :: b (bound at Productive.hs:159:5) b :: b (bound at Productive.hs:158:5) s' :: Forall1 Stream a (bound at Productive.hs:157:9) (Some bindings suppressed; use -fmax-relevant-binds=N or -fno-max- relevant-binds) }}} When I set `-fno-max-relevant-binds)`, this extends with: {{{ a :: a (bound at Productive.hs:157:6) s :: forall (k :: Clock). Stream k a (bound at Productive.hs:156:9) f :: a -> Par b (bound at Productive.hs:156:7) maapM :: (a -> Par b) -> (forall (k :: Clock). Stream k a) -> Par (Forall1 Stream b) (bound at Productive.hs:156:1) take :: forall a. Int -> (forall (k :: Clock). Stream k a) -> Par [a] (bound at Productive.hs:143:1) ...and a pile more global binds... }}} I think this is not really the behavior we want. If I'm doing an Agda/Coq development, what I want is for the compiler to tell me all LOCAL bindings. Heuristically picked global bindings might be nice, but it's not a priority (after all, I probably have explicit type signatures for all of these anyway.) So really, to see all local bindings I just want to set `-fmax-relevant-binds=100000` (i.e., to a large number.) So, I think there should be another flag `-frelevant-global-binds` which triggers display of global relevant bindings, making `-fno-max-relevant- binds` equivalent to `-fmax-relevant-binds=BIGNUM`; i.e., it does NOT report global bindings. I don't know if the error message should mention `-frelevant-global-binds` by default, but for now I would say it shouldn't. As a minor addendum, I don't find the context information `In the second argument of ‘(<$>)’, namely ‘_’`, etc. very useful. Just makes the message longer and harder to view. -- -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12183#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler