[Haskell-cafe] Haskell from SML - referrential Transparency?!
Gregory Guthrie
guthrie at mum.edu
Tue Apr 19 21:38:18 CEST 2011
Oops;
No - my (further) mistake. It is not IO() - f1 returns a data structure which implements Show, and the test is really:
Test1 = do print "Test1:"
print f1
(etc..)
Thanks for the alert on trace.
I used it like this:
allocate :: Store -> (Store, Location)
allocate ( Store(bot,top,sto) ) |
trace("allocate "++ show bot ++ show top)
False = undefined
allocate ( Store(bot,top,sto) ) =
let newtop = top+1
and it does seem to show every allocation on the first run of f1, but then nothing on the second.
SO it is not just a first call to allocate, but all calls under an invocation of f1 that don't show.
Makes me wonder if f1 is even being re-evaluated.
I did post the code - but don't expect anyone to really wade through and debug for me! :-)
(The issues that I am asking about are a9b, a9bb at line 435, 438)
http://hpaste.org/45851/haskell_from_sml_question
thanks for the help.
-------------------------------------------
> -----Original Message-----
> From: Daniel Fischer [mailto:daniel.is.fischer at googlemail.com]
> Sent: Tuesday, April 19, 2011 2:16 PM
> To: haskell-cafe at haskell.org
> Cc: Gregory Guthrie
> Subject: Re: [Haskell-cafe] Haskell from SML - referrential Transparency?!
>
> On Tuesday 19 April 2011 21:10:09, Gregory Guthrie wrote:
> > I am pretty new to Haskell, so need some clarification.
> > I am porting some code from SML, and getting a result that surprises me.
> >
> > I basically have some functions which work like this:
> > f1 = fa fb fc
> > test1 = do print "test1:"
> > f1
>
> So f1 :: IO something
>
> Being an IO-action, f1 can return different things in different invocations since the world in
> which it runs has changed (it might read a file which was modified between the first and the
> second invocation, for example).
>
> >
> > But I ran a few tests, and got odd results - so I ran the same test
> > function twice, and got different results - that was my surprise. I
> > did
> > this:
> > f1 = fa fb fc
> > f2 = fa fb fc
> > test2 = do print "test1:"
> > f1
> > f2
> >
> > and I get different results from the two executions (f1,f2), even
> > though they have exactly the same definition. Reversing their order,
> > gives the exact same results (i.e. the results are still different, and in the
> > same original order as f2;f1). Even doing (f1;f1) gives two different
> > results.
>
> Depending on what f1 does, that may be perfectly normal or a serious bug.
> We'd need to see more of the code to determine which.
>
> >
> > Seems to me that by referential transparency, I should always get the
> > same result from the function(s).
> >
> > So, I added some Debug.trace to the argument functions which are used,
> > and I get a trace from the first call(s), but none from the second
> > one(s), although I do get the result from each.
>
> Did you do it in the form
>
> fa = trace ("fa") realFa
>
> ?
>
> Then the trace is only evaluated the first time fa is evaluated, even if fa is called later
> again.
>
> >
> > It is as if because of the laziness, it someone cached some of the
> > intermediate results, so did not re-invoke the functions.
> >
> > Anyway, totally confused. I must be missing something significant here.
> > Thanks for any clarification! (The original code is a bit long, so I
> > did not include here...)
>
> http://hpaste.org/
>
> perhaps?
More information about the Haskell-Cafe
mailing list