[GHC] #11035: Add implicit call-stacks to partial functions in base
GHC
ghc-devs at haskell.org
Thu Oct 29 17:20:26 UTC 2015
#11035: Add implicit call-stacks to partial functions in base
-------------------------------------+-------------------------------------
Reporter: gridaphobe | Owner:
Type: feature request | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.10.2
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 goldfire):
I like this general idea. But I want to find a way to the bottom of the
slope, where '''all''' partial functions in base get call stack
information. This plan alleviates your problem (3) quite nicely.
* For problem (1): it seems quite easy to write a core-to-core pass that
scrubs away the call stacks. This core pass would be enabled by `-O` but
could be countermanded with `-fno-scrub-call-stacks` (in case there is an
error only in optimized code, say). base would be compiled with `-fno-
scrub-call-stacks`.
This approach doesn't fix the performance of library functions,
though. So we could instead have base export two versions of the
functions, one with call stacks and one without. How do we relate the two?
Via `RULES`:
{{{#!hs
foldr1 :: (?callstack :: CallStack) => ...
faster_foldr1 :: ...
{-# RULES "foldr1 call stack scrub" foldr1 = faster_foldr1 #-}
}}}
Without optimizations, we get the call stack. With optimizations, we
don't. Huzzah.
It's easy to imagine someone wanting to disable only these call-stack-
ish RULES but keep others. Perhaps we should consider tagging RULES
somehow to allow activating or deactivating RULES in groups. But that's a
proposal for another day, and I don't think we absolutely need that here.
* For problem (2): Your suggestions are good. We could also do a cheap
trick like this:
{{{#!hs
type PartialFunction = (?callstack :: CallStack)
head :: PartialFunction => [a] -> a
}}}
Yes, this needs `ConstraintKinds`, but I sorta like it.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11035#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list