[Haskell-cafe] Source code location in IO?
MarLinn
monkleyon at googlemail.com
Tue Jun 21 18:27:17 UTC 2016
>> Is it compatible with the semantics of Haskell to have a function
>> sourceLocation :: IO String which when run returns the source file
>> location at which it is used?
> It's totally compatible with Haskell semantics, since Haskell does not
> give any semantics to IO. Anything can happen when you do IO. But it's
> still a bit weird. :)
I think the weird feeling stems exactly from the fact that IO has no
well-defined syntax. It's our convenient catch-all for anything remotely
un-pure.
Nondeterminism? Put it in IO! (Instead of a purely nondeterministic context)
Non-destructive read access to a file? Put it in IO! (instead of adding
Maybe to a nondeterministic context)
Deterministic fire-and-forget write access to a log file? Put it in IO!
(instead of a context that just provides an ordering)
Firing missiles or calling the system to do an "rm -rf /"? Put it in IO!
(instead of a
System.Unsafe.Extras.Hidden.Unsafe.Very.WarningUnsafeDontTouchWhyDoWeEvenHaveThisOMGGetAwayFromMe)
So let's just view IO as a shorthand for some unknown as-yet unspecified
monad stack. (But note that most of the contexts I mentioned don't even
need to be monadic)
This is not to say IO is not good to have in this form. It's just not a
helpful context to answer this question.
From this vantage point a possibly better form of the question would
be: Could we define a context which contains the required semantics that
is consistent with Haskell syntax?
Something like
thisLine :: SourceInfo Int
Of course once you have such a context you can just assume it's part of
IO because everything is part of IO.
To answer the modified question just think about these facts:
1. We can define contexts with 100% determinism across almost any
transformation including changing all the source code around it, the
compiler, the language version, and all optimizations. (pure functions,
i.e. the Identity context)
2. We can also define contexts with almost 100% non-determinism even
across two consecutive invocations with nothing else changed. (calls to
external random number generators)
3. The context we are searching for would be deterministic across an
intermediate subset of meta-transformations.
So if these special semantics were not allowed we would have an
inconsistent scale of determinism across meta-transformations, and that
would need some serious explaining. Ergo it should be allowed.
This trail of thought does bring up two interesting follow-up questions
though: Is the hidden structure of the IO stack tightly bound to a
theory of consistency across meta-transformations? And do we even have a
suitable theory of such transformations if we would want to refine IO? I
have no idea.
MarLinn
More information about the Haskell-Cafe
mailing list