[Haskell-cafe] Clearly, Haskell is ill-founded
Conor McBride
ctm at Cs.Nott.AC.UK
Mon Jul 16 03:14:44 EDT 2007
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
More information about the Haskell-Cafe
mailing list