> Norman Ramsey wrote:
 > 
 > >   compile1 :: (Builder b box) => t -> Name -> Ir.ANF -> b t
 > >   compile1 f x body = do env <- compile body empty
 > >                          wire (Arg W) (env x)
 > >                          return f
 > >   class (Monad b) => Builder b box where
 > >     wire            :: Source box -> Sink box -> b ()
 > > This program is rejected by GHC...
 > 
 > He continued, [paraphrase] however, compile1 is accepted if the signature is
 > removed. Furthermore, the inferred signature seems identical to the
 > one given above.
 > 
 > That is not a bug...
 >
 > What to do? If applicable, add a functional dependency ...
 > 
 > Or, one may use the local type variable to the same end
 > 
 > >   compile1 :: forall b t box. (Builder b box) => t -> Name -> Ir.ANF -> b
 > >   t compile1 f x body = do env <- compile body empty
 > >                          wire ((Arg W)::Source box) (env x)
 > >                          return f
 > 
 > the explicit `forall' binder is required.

This suggestion, I like.  I have always hated that ML and Haskell
leave the foralls implicit.  Bad design.

To be sure I understand: the reason the explicit forall is required is
to bring 'box' into scope so it can be used in the type constraint on
(Arg W)?


Norman
_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to