
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
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?