
Now your consumers can write:
getSourceLoc assert :: String
And you will have a value that describes where you are. You can then use this to implement logging, throw errors etc. The annoying part is that you have to explicitly pass in assert from the call site to make sure that you get the right source location reported.
Yes, in fact the 'loch' package does this. Initially I thought that having a dummy argument on every single log call and throw (quite a few of those) would be too much hassle, but if I have to keep fixing the preprocessor I might start reconsidering. Another thing is that performance in logging is pretty critical. When I profile, logging functions wind up in the expensive list if I'm not careful. I don't know bad an unsafePerformIO plus a catch for every log msg is going to be, but it's not going to be as fast as doing the work at compile time.