summaryrefslogtreecommitdiff
path: root/testsuite/tests/typecheck/should_compile/T11339b.hs
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2016-06-11 23:49:27 +0100
committerSimon Peyton Jones <simonpj@microsoft.com>2016-06-13 10:57:03 +0100
commit15b9bf4ba4ab47e6809bf2b3b36ec16e502aea72 (patch)
treee2e7336c63e9b7130ba70f3551ff290d4a25184b /testsuite/tests/typecheck/should_compile/T11339b.hs
parentd25cb61a1c2a135a2564143a332f8b2962f134bc (diff)
downloadhaskell-15b9bf4ba4ab47e6809bf2b3b36ec16e502aea72.tar.gz
Improve typechecking of let-bindings
This major commit was initially triggered by #11339, but it spiraled into a major review of the way in which type signatures for bindings are handled, especially partial type signatures. On the way I fixed a number of other bugs, namely #12069 #12033 #11700 #11339 #11670 The main change is that I completely reorganised the way in which type signatures in bindings are handled. The new story is in TcSigs Note [Overview of type signatures]. Some specific: * Changes in the data types for signatures in TcRnTypes: TcIdSigInfo and new TcIdSigInst * New module TcSigs deals with typechecking type signatures and pragmas. It contains code mostly moved from TcBinds, which is already too big * HsTypes: I swapped the nesting of HsWildCardBndrs and HsImplicitBndsrs, so that the wildcards are on the oustide not the insidde in a LHsSigWcType. This is just a matter of convenient, nothing deep. There are a host of other changes as knock-on effects, and it all took FAR longer than I anticipated :-). But it is a significant improvement, I think. Lots of error messages changed slightly, some just variants but some modest improvements. New tests * typecheck/should_compile * SigTyVars: a scoped-tyvar test * ExPat, ExPatFail: existential pattern bindings * T12069 * T11700 * T11339 * partial-sigs/should_compile * T12033 * T11339a * T11670 One thing to check: * Small change to output from ghc-api/landmines. Need to check with Alan Zimmerman
Diffstat (limited to 'testsuite/tests/typecheck/should_compile/T11339b.hs')
-rw-r--r--testsuite/tests/typecheck/should_compile/T11339b.hs32
1 files changed, 32 insertions, 0 deletions
diff --git a/testsuite/tests/typecheck/should_compile/T11339b.hs b/testsuite/tests/typecheck/should_compile/T11339b.hs
new file mode 100644
index 0000000000..5401364e77
--- /dev/null
+++ b/testsuite/tests/typecheck/should_compile/T11339b.hs
@@ -0,0 +1,32 @@
+{-# LANGUAGE NoMonomorphismRestriction, RankNTypes, ScopedTypeVariables #-}
+
+module T11339b where
+
+import Control.Applicative ( Const(Const, getConst) )
+import Data.Functor.Identity ( Identity(Identity) )
+
+type Traversal s t a b = forall f. Applicative f => (a -> f b) -> s -> f t
+
+failing :: forall s t a b . Traversal s t a b -> Traversal s t a b -> Traversal s t a b
+failing left right afb s = case pins t of
+ [] -> right afb s
+ _ -> t afb
+ where
+ t :: Applicative f => (a -> f b) -> f t
+ -- Works because of NoMonomorphismRestriction
+ Bazaar { getBazaar = t } = left sell s
+
+ sell :: a -> Bazaar a b b
+ sell w = Bazaar ($ w)
+
+ pins :: ((a -> Const [Identity a] b) -> Const [Identity a] t) -> [Identity a]
+ pins f = getConst (f (\ra -> Const [Identity ra]))
+
+newtype Bazaar a b t = Bazaar { getBazaar :: (forall f. Applicative f => (a -> f b) -> f t) }
+
+instance Functor (Bazaar a b) where
+ fmap f (Bazaar k) = Bazaar (fmap f . k)
+
+instance Applicative (Bazaar a b) where
+ pure a = Bazaar $ \_ -> pure a
+ Bazaar mf <*> Bazaar ma = Bazaar $ \afb -> mf afb <*> ma afb