[Haskell-cafe] Reifying case expressions [was: Re: On stream processing, and a new release of timeplot coming]
Sebastian Fischer
fischer at nii.ac.jp
Tue Dec 27 12:11:55 CET 2011
On Tue, Dec 27, 2011 at 5:35 AM, Eugene Kirpichov <ekirpichov at gmail.com>wrote:
> I wonder if now this datatype of yours is isomorphic to StreamSummary b
>>> r -> StreamSummary a r.
>>>
>> Not sure what you mean here. StreamSummary seems to be the same as
>> ListConsumer but I don't see how functions from consumers to consumers are
>> list transformers, i.e., functions from lists to lists.
>>
> Well. They are isomorphic, if list transformers are represented as
> functions from lists. I'm assuming they could be with the other
> representation too.
>
> type ListT a b = forall r . ([b] -> r) -> ([a] -> r)
>
I see! I think the type
type ContListTransformer a b = forall r . ListConsumer b r ->
ListConsumer a r
is isomorphic to `ListConsumer a [b]`. Here are the isomorphisms (I did not
check whether they are indeed isomorphisms):
clt2lc :: ContListTransformer a b -> ListConsumer a [b]
clt2lc clt = clt idC
lc2clt :: ListConsumer a [b] -> ContListTransformer a b
lc2clt _ (Done r) = Done r
lc2clt (Done []) (Continue r _) = Done r
lc2clt (Done (b:bs)) (Continue _ f) = lc2clt (Done bs) (f b)
lc2clt (Continue bs f) c =
Continue (consumeList c bs) (\a -> lc2clt (f a) c)
However, `ListTransformer a b` is less expressive because of it's
incremental nature. Every list transformer `t` satisfies the following
property for all `xs` and `ys`:
transformList t xs `isPrefixOf` transformList t (xs++ys)
List *consumers* don't need to follow this restriction. For example, the
consumer
Continue [1] (\_ -> Done [])
which represents the function
nonIncr [] = [1]
nonIncr _ = []
is not incremental in the sense above, because
not (nonIncr [] `isPrefixOf` nonIncr ([]++[0]))
I think it is the incremental nature of list transformers that allows them
to be composed in lock-step in the Category instance. `lc2clt` above is
sequential composition for list *consumers* but it applies the second
consumer only after executing the first completely.
Sebastian
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20111227/0b1d9348/attachment.htm>
More information about the Haskell-Cafe
mailing list