For reasons explained in "Let should not be generalised" GHC isn't going to 
generalise local let-bindings, at least not when  you switch on GADTs , which 
you have.

So unBM is monomorphic, hence the error.

Give it a type signature, or make it top-level. Either works fine.

Simon

From: [email protected] [mailto:[email protected]] On 
Behalf Of David Peixotto
Sent: 16 September 2010 17:38
To: [email protected]
Subject: New type error when compiling with GHC head

I'm now getting a type error when compiling with GHC HEAD that I wasn't getting 
before (also GHC 6.10 and GHC 6.12 work fine). The code is part of a larger 
program that I did not write and the type error is confusing to me. I cut it 
down to the minimal I could, so hopefully it will be useful. Can someone 
comment if this is a bug, or the program needs to be changed?

Code:(Backtrack.hs)
{-# OPTIONS_GHC -fglasgow-exts #-}
module Backtrack where
import Control.Monad

-- Combining endomorphisms and continuations
-- a la Ralf Hinze

-- BacktrackM = state monad transformer over the backtracking monad
newtype BacktrackM s a = BM (forall b . (a -> s -> b -> b) -> s -> b -> b)

instance Monad (BacktrackM s) where
    return a   = BM (\c s b -> c a s b)
    BM m >>= k = BM (\c s b -> m (\a s b -> unBM (k a) c s b) s b)
      where unBM (BM m) = m
    fail _ = mzero

instance MonadPlus (BacktrackM s) where
  mzero                 = BM (\c s b -> b)
  (BM f) `mplus` (BM g) = BM (\c s b -> g c s $! f c s b)

Error:
Backtrack.hs:13:18:
    Couldn't match type `b' with `b2'
      because this skolem type variable would escape: `b2'
    This skolem is bound by
      the polymorphic type `forall b. (a -> s -> b -> b) -> s -> b -> b'
    The following variables have types that mention b
      unBM :: BacktrackM s b1 -> (b1 -> s -> b -> b) -> s -> b -> b
        (bound at Backtrack.hs:14:13)
    In the first argument of `BM', namely
      `(\ c s b -> m (\ a s b -> unBM (k a) c s b) s b)'
    In the expression:
      BM (\ c s b -> m (\ a s b -> unBM (k a) c s b) s b)
    In an equation for `>>=':
        (BM m) >>= k
          = BM (\ c s b -> m (\ a s b -> unBM (k a) c s b) s b)
          where
              unBM (BM m) = m

-David

_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to