Type inference regression with RankNTypes (GHC 8.1)
The following module compiles fine with ghc-8.0.1:
{-# LANGUAGE RankNTypes #-}
module Acquire where
newtype Acquire a = Acquire {unAcquire :: (forall b. b -> b) -> IO a}
instance Functor Acquire where
fmap = undefined
instance Applicative Acquire where
pure = undefined
(<*>) = undefined
instance Monad Acquire where
Acquire f >>= g' = Acquire $ \restore -> do
x <- f restore
let Acquire g = g' x
-- let g = unAcquire (g' x)
g restore
HEAD (83e4f495, ghc-8.1.20160720) reports:
Acquire.hs:17:21: error:
• Couldn't match expected type ‘t’
with actual type ‘(forall b1. b1 -> b1) -> IO b’
‘t’ is a rigid type variable bound by
the inferred type of g :: t at Acquire.hs:17:13-28
• In the pattern: Acquire g
In a pattern binding: Acquire g = g' x
In the expression:
do { x <- f restore;
let Acquire g = g' x;
g restore }
• Relevant bindings include
g' :: a -> Acquire b (bound at Acquire.hs:15:19)
(>>=) :: Acquire a -> (a -> Acquire b) -> Acquire b
(bound at Acquire.hs:15:15)
This example is reduced from the recourcet package on Hackage, module Data.Acquire.Internal.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 8.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler (Type checker) |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |