[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