<div dir="ltr">Hi,<div><br></div><div>Occassionally, in (*good*) haskell libraries, I came across data types that are defined with a single constructor and a forall.</div><div><br></div><div><div>For instance, Iteratee[0] is defined as below</div><div><br></div><div><br></div><div><b>newtype Iteratee s m a =</b></div><div><b>    Iteratee {runIter :: forall r. (a -> Stream s -> m r) -> ((Stream s -> Iteratee s m a) -> Maybe SomeException -> m r) -> m r}</b></div><div><br></div><div><br></div><div><br></div><div>I *think* it is equivalent to the following. But am not sure.</div><div><b>data Iteratee s m a  = IOne (m (a , Stream s))</b></div><div><b>                 | ITwo (Stream s -> m (Iteratee s m a)) (Maybe SomeException)</b></div><div><br></div><div><br></div><div>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)? </div></div><div><br></div><div>And can some one kindly point me to some references that help me  convert from one form to another reliably?</div><div><br></div><div>Many Thanks,</div><div>Hemanth</div><div><br></div><div><br></div><div><br></div></div>