On Apr 4, 2006, at 3:47 AM, Simon Marlow wrote:

On 30 March 2006 23:12, Andy Gill wrote:

Implementation:

deepSeq (RAW_CONS <is_deep_seq'd_bit> ... fields ) =
     if <is_deep_seq'd_bit> == True
         then return  /* hey, we've already deepSeq'd this */
         else set <is_deep_seq'd_bit> to True.
                  deepSeq (field_1)
                  ...
                  deepSeq (field_n)
deepSEQ (REF/MVAR...) = return

So deepSeq doesn't return _|_ when passed a cyclic structure? This is a
bad idea, because it lets you distinguish cyclic structures from
infinite ones. deepSeq has to behave like a function, regardless of its
implementation.

Cheers,
        Simon

Good observation, though pragmatically I'd rather the deepSeq to
behave well on loops. Its the thunks I'm trying to remove, not
the loop itself.

Allowing loops in the returned value gives the the beauty of laziness
to construct the cycle, but the assurance that the structure does not contain
thunks. A nice property, and a way to interact with laziness.

let xs' () = 1 : 2 :  xs' ()
let xs2 = xs'

let xs = 1 : 2 : xs

So deepSeq xs2 ==> _|_, but deepSeq xs ==> xs

I appeal to the "morally correct reasoning"  argument .. If the program
terminates, then it is still correct. The deepSeq is an assertion about
the ability to represent the result in finite space.

You could imagine a timestamp implementation of deepSeq, though,
that would disallow loops, but allow for the caching of previous deepSeq
calls; the property I'm really after.

Andy Gill

_______________________________________________
Haskell-prime mailing list
Haskell-prime@haskell.org
http://haskell.org/mailman/listinfo/haskell-prime

Reply via email to