[Haskell-cafe] Source code location in IO?
Tom Ellis
tom-lists-haskell-cafe-2013 at jaguarpaw.co.uk
Mon Jun 20 15:20:48 UTC 2016
On Mon, Jun 20, 2016 at 05:14:45PM +0200, Erik Hesselink wrote:
> It feels weird to me that this program transformation produces
> different output, and I can't seem to think of another IO action that
> behaves this way. Essentially, you'd want `IO a` to have different
> semantics from other `a`s, in that let binding it changes what it
> does.
It's definitely weird, but it seems consistent with some behaviour we see
around lazy IO, Cf these threads
https://mail.haskell.org/pipermail/haskell/2009-March/021064.html
https://mail.haskell.org/pipermail/haskell/2009-March/021071.html
> However, you can do this with the `qLocation` Template Haskell
> function in Language.Haskell.TH.Syntax. Does that help?
I meant it more as a sort of theoretical question.
> On 20 June 2016 at 17:03, Tom Ellis
> <tom-lists-haskell-cafe-2013 at jaguarpaw.co.uk> wrote:
> > 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? For
> > example, suppose Main.hs is
> >
> > module Main where
> >
> > main = do
> > putStrLn =<< sourceLocation
> > putStrLn "Hello"
> > putStrLn =<< sourceLocation
> >
> > It would print the following when run
> >
> > Main.hs:4
> > Hello
> > Main.hs:6
> >
> > and
> >
> > module Main where
> >
> > main = do
> > let s = sourceLocation
> > putStrLn =<< s
> > putStrLn "Hello"
> > putStrLn =<< s
> >
> > It would print the following when run
> >
> > Main.hs:4
> > Hello
> > Main.hs:4
> >
> > If this is not compatible with the semantics of Haskell, why not? I agree
> > that the two programs must have the same denotation, but is there anything
> > that requires them to have the same output when run?
More information about the Haskell-Cafe
mailing list