Hi Derek

On 16 Jul 2007, at 02:48, Derek Elkins wrote:

On Mon, 2007-07-16 at 02:29 +0100, Conor McBride wrote:
Hi

data{-codata-} Punter = Speak String (String -> Punter)


[..]


data{-codata-} Stream x = x :> (Stream x)

cafe :: Punter -> (String -> Punter) -> Stream (String, String)
cafe (Speak question learn) guru =
  let  Speak answer guru' = guru question
  in   (question, answer) :> (cafe (learn answer) guru')

If the Punter asks the appropriate question, perhaps the guru will spend
the rest of time thinking about an answer.

It's true that answers can take a while, but not forever if the guru is
also a productive coprogram. In more realistic examples, mere productivity
might not be enough: you might want to be sure that questions will
eventually be answered, after some initial segment of "busy" responses.

To that end, an exercise. Implement a codata type

data{-codata-} Mux x y = ...

which intersperses x's and y's in such a way that

  (1) an initial segment of a Mux does not determine whether the next
    element is an x or a y (ie, no forced *pattern* of alternation)

  (2) there are productive coprograms

        demuxL :: Mux x y -> Stream x
        demuxR :: Mux x y -> Stream y

    (ie, alternation is none the less forced)

You may need to introduce some (inductive) data to achieve this. If you
always think "always", then you need codata, but if you eventually think
"eventually", you need data.

All the best

Conor

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to