laziness again...

Jay Cox sqrtofone@yahoo.com
Mon, 18 Feb 2002 18:49:54 -0600 (CST)


On Mon, 18 Feb 2002, Jay Cox wrote:

> On 18 Feb 2002, Ketil Z. Malde wrote:
>
> >
> > Hi,
> >
> > I'm a bit puzzled by this observatio that I made.  I have a function
> > that, pseudocoded, lookes somewhat like
> >
> > f i as bs cs = ins i (f (i+1) as) ++ ins i (f (i+1) bs) ++ ins i (f (i+1) cs)
> >         where ins i = manipulates the first element of the list
> >
> > Now, without the ins'es, the function appears to be lazy, i.e I can
> > "take" a part of it without evalutating the rest.  With the ins'es,
> > the whole thing seems to be calculated as soon as I touch it.
> >
> > Is this obvious?  Or is my observation wrong?
> >
> > -kzm
>
>
> um, looks like ins i returns a function of one argument which results
> in a list.  (or ins is a function of two arguments which results in a list
> and ins i is just using currying;  however you want to look at it)
>
> My question is if that function (ins i) is strict.
>
> Jay

<Cough>.

I should have read your letter more closely.

> >         where ins i = manipulates the first element of the list

if you mean that (ins i) :: [a] -> [a] manipulates the first element of
the list it takes then of course it is strict.  because in

ins i = \x -> case x of
                  (a:as) -> foo a : as
                  [] -> []
    where foo a = ...

((ins i) list) must pattern match on list.  therefore (ins i) _|_ = _|_
QED.


I guess the kind of strictness I was thinking about is something along
the lines of what you might get if you applied deepseq to the list (if
such a type of strictness has been defined by anybody!)
I got a bit confused.

(example definition for sake of argument)

(a:xs) ++ list = a:(xs ++ list)
[] ++ list     = list


If (ins i) had such deep strictness then when the first element of (f i as
bs cs) was forced, haskell would generate all of the list created by
(ins i (f (i+1) as) since (++) is strict in the first argument.
however, (:) is strict in neither argument, so (++) is lazily applied.


Anyway...


You might follow Bernard James POPE <bjpop@cs.mu.OZ.AU> recent posting
(Subject: re: order of evaluation) about using "undefined" in the list to
see how things are  being evaluated, like in

list = 3:4:5:undefined

or


list = 3:4:5:error "foo"


(I got that idea from one of Simon Marlow's papers)


Jay Cox


PS: deepseq was mentioned earlier in either this list or the other main
Haskell list.  I believe it was actually a DeepSeq module of some sort.