
On Mon, Feb 25, 2013 at 09:57:04AM +0100, Joachim Breitner wrote:
Hi,
Am Montag, den 25.02.2013, 08:06 +0200 schrieb Michael Snoyman:
Quite a while back, Simon Hengel and I put together a proposal[1] for a new feature in GHC. The basic idea is pretty simple: provide a new pragma that could be used like so:
error :: String -> a errorLoc :: IO Location -> String -> a {-# REWRITE_WITH_LOCATION error errorLoc #-}
in light of attempts to split base into a pure part (without IO) and another part, I wonder if the IO wrapping is really necessary.
Can you elaborate the reason why a simple "Location ->" is not enough?
The IO helps with reasoning. Without it you could write code that does something different depending on the call site. Here is an example: someBogusThingy :: Int someBogusThingy = .. someBogusThingyLoc :: Location -> Int someBogusThingyLoc loc | (even . getLine) loc = 23 | otherwise = someBogusThingyLoc {-# REWRITE_WITH_LOCATION someBogusThingy someBogusThingyLoc #-} Now someBogusThingy behaves different depending on whether the call site is on an even or uneven line number. Admittedly, the example is contrived, but I hope it illustrates the issue. I do not insist on keeping it. If we, as a community, decide, that we do not need the IO here. Then I'm fine with dropping it. Cheers, Simon