New type error when compiling with GHC head
Simon Peyton-Jones
simonpj at microsoft.com
Thu Sep 16 12:45:22 EDT 2010
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: cvs-ghc-bounces at haskell.org [mailto:cvs-ghc-bounces at haskell.org] On Behalf Of David Peixotto
Sent: 16 September 2010 17:38
To: cvs-ghc at haskell.org
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/cvs-ghc/attachments/20100916/9d62d925/attachment-0001.html
More information about the Cvs-ghc
mailing list