Antoine Latter wrote:
While I also offer a transformer version of MaybeCPS, the transformer *does*
suffer from significant slowdown. Also, for MaybeCPS it's better to leave
the handlers inline in client code rather than to abstract them out; that
helps to keep things concrete. So perhaps you should first try a direct CPS
translation:
Is the CPS transformed MaybeT slower because it's done in 2-CPS,
rather than in 1-CPS like the MaybeCPS? I only did MaybeT in 2-CPS
because it was the easiest, not because I thought it would be easiest.
I'm not sure how much of it is due to the 2-CPS vs how much is due to
the loss of concrete case-analysis and tail-calls in crucial areas. As I
noted in comments on the non-transformer version, there are a number of
subtle issues such as the choice between let-binding and case analysis
which have major effects on performance, so it's tricky to make a
MaybeCPS which doesn't impose a performance overhead.
A big part of the problem is that once you move to the transformer
version, you can't just jump to the next handler--- you also need to
carry around whatever the other monad would add to Nothing. Once you
move to 2-CPS, the representation is similar enough to LogicT
(==ListCPST) that you seem to loose the benefits of Maybe over [].
--
Live well,
~wren
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe