andy at galois.com
Tue Apr 4 14:48:14 EDT 2006
On Apr 4, 2006, at 3:47 AM, Simon Marlow wrote:
> On 30 March 2006 23:12, Andy Gill wrote:
>> 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
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
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.
More information about the Haskell-prime