producing and consuming lists
Jorge Adriano
jadrian@mat.uc.pt
Wed, 6 Nov 2002 01:32:21 +0000
> streams :: (Int -> Bool, Int -> Bool) -> (Int,Int) ->
> [(Maybe Int,Maybe Int)]
> streams (p,q) (x,y)
>
> | p x && p y =3D (Just x , Just y ) : xs
> | p x =3D (Just x , Nothing) : xs
> | p y =3D (Nothing, Just y ) : xs
> | otherwise =3D xs
>
> where xs =3D streams (p,q) ((x+y),(y-x))
Yeap, in fact I thought about it when answering Toms answer.
Doesn't seem good enough in more general cases though,
Like:=20
streams :: (Int->Bool, Int->Bool)->(Int, Int)->([Int],[Int])
streams (p,q) (x,y) =3D (xs',ys')
where
(xs,ys) =3D streams (p,q) ((x+y),(y-x))
xs' =3D if p x then x:xs else zs++xs <-------
ys' =3D if q y then y:xs else ys
zs =3D some_other_stream <----------
Or:
streams :: (Int->Bool, Int->Bool)->(Int, Int)->([Int],[Int])
streams (p,q) (x,y) =3D (xs',ys')
where
(xs,ys) =3D streams (p,q) ((x+y),(y-x))
xs' =3D if p x then x:xs else zs -- <------------
ys' =3D if q y then y:xs else ws -- <-----------
zs =3D ... some other_stream -- <---
ws=3D ... yet_another_stream -- <---
> With this setup, I think you can write your own writefile function whic=
h
> looks something like:
> I think, but I'm not sure, that this will allow the old stuff to be
> garbage collected. In practice, you don't get too much useless junk
> generated because we don't append the (Nothing,Nothing) pair to the lis=
t
Nice observation, I missed that one since I didn't paired both lists :)
But like I just showed, sometimes paring them may not be a natural approa=
ch=20
though...
> (erm, "prepend"). But what's more important, I think you only evaluate
> the same amount of each at any given time, thus allowing GC to gobble u=
p
> the old stuff.
Exactly
> An expert might be able to prove me wrong, though, or you could try thi=
s
> and profile it and see if it works or not :)
I haven't tested it yet either but seems to me like it should work, in th=
is=20
particular example.
I was hoping I could somehow take advantage of the fact that the order in=
=20
which I want to consume the lists doesn't matter. I thought about concurr=
ency=20
but it doesn't seem to work.
J.A.