[Haskell-cafe] asserting the type of a binding in a "do" expression

Philip Weaver philip.weaver at gmail.com
Sat Apr 26 13:34:15 EDT 2008


On Fri, Apr 25, 2008 at 11:49 PM, Brandon S. Allbery KF8NH
<allbery at ece.cmu.edu> wrote:
>
>  On Apr 26, 2008, at 2:36 , Ken Takusagawa wrote:
>
>
> > But this does not:
> >
> >  foo::IO a;
> >  foo = do{
> >   (x::a) <- bar;
> >   return x;};
> >
> > Error message: A pattern type signature cannot bind scoped type
> > variables `a' unless the pattern has a rigid type context.
> >
>
Yeah, using the "forall" is exactly what you want to fix this problem.
 It puts the type variable in scope throughout the definition of the
function.
>  This works for me (in a slightly out of date HEAD) if I explicitly forall
> the declaration as per the ghc manual (see section 8.7.6.3):
>
>  > bar :: forall b. IO b
>  > bar =  return undefined -- just want a type for now
>  > foo :: forall a. IO a
>
>  > foo =  do { (x :: a) <- bar; return x; }
>
>  --
>  brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery at kf8nh.com
>  system administrator [openafs,heimdal,too many hats] allbery at ece.cmu.edu
>  electrical and computer engineering, carnegie mellon university    KF8NH
>
>
>
>
>  _______________________________________________
>  Haskell-Cafe mailing list
>  Haskell-Cafe at haskell.org
>  http://www.haskell.org/mailman/listinfo/haskell-cafe
>


More information about the Haskell-Cafe mailing list