[Haskell-cafe] A datatype with a single constructor and forall to multiple constructors without forall

Roman Cheplyaka roma at ro-che.info
Wed Jul 1 14:38:04 UTC 2015


On 01/07/15 17:10, Hemanth Kapila wrote:
> Hi,
> 
> Occassionally, in (*good*) haskell libraries, I came across data types
> that are defined with a single constructor and a forall.
> 
> For instance, Iteratee[0] is defined as below
> 
> 
> *newtype Iteratee s m a =*
> *    Iteratee {runIter :: forall r. (a -> Stream s -> m r) -> ((Stream s
> -> Iteratee s m a) -> Maybe SomeException -> m r) -> m r}*
> 
> 
> 
> I *think* it is equivalent to the following. But am not sure.
> *data Iteratee s m a  = IOne (m (a , Stream s))*
> *                 | ITwo (Stream s -> m (Iteratee s m a)) (Maybe
> SomeException)*
> 
> 
> Can some one please explain what are the advantages of using the forall
> version? Does it significantly improve performance because it is
> newtype? Or does it help in reasoning about code (in some proof tools or
> such)? 
> 
> And can some one kindly point me to some references that help me
>  convert from one form to another reliably?

Here are a couple of references:

http://okmij.org/ftp/tagless-final/course/Boehm-Berarducci.html
http://www.janis-voigtlaender.eu/papers/AsymptoticImprovementOfComputationsOverFreeMonads.pdf



-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20150701/40e7982b/attachment.sig>


More information about the Haskell-Cafe mailing list