[Haskell-cafe] Really need some help understanding a solution

wren ng thornton wren at freegeek.org
Thu Mar 26 22:41:35 EDT 2009


Thomas Hartman wrote:
> Luke, does your explanation to Guenther have anything to do with
> coinduction? -- the property that a producer gives a little bit of
> output at each step of recursion, which a consumer can than crunch in
> a lazy way?

It has more to do with "tying the knot" (using laziness to define values 
in terms of themselves), though there are similarities. Take the function:

     infZipWith f ~(x:xs) ~(y:ys) = f x y : infZipWith f xs ys

which we could write less clearly as:

     infZipWith f xxs yys =
         f (head xxs) (head yys) : infZipWith f (tail xxs) (tail yys)

The trick is that we can emit the thunk for f(head xxs)(head yys) 
without knowing what values xxs and yys actually contain--- they could 
still be _|_! The hope is that by the time we get to where someone asks 
for the value of that thunk ---by that point--- we *will* know enough 
about xxs and yys that we can give an answer.

For knot tying to work, we must ensure that we don't ask for things 
"from the future" before we've actually created them. If we do, then the 
function will diverge, i.e. _|_. This shares similarities with the ideal 
1-to-1 producer/consumer role for deforestation (whence, similarities to 
coinduction).

-- 
Live well,
~wren


More information about the Haskell-Cafe mailing list