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? _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe