summaryrefslogtreecommitdiff
path: root/testsuite/tests/indexed-types/should_compile/Gentle.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/indexed-types/should_compile/Gentle.hs')
-rw-r--r--testsuite/tests/indexed-types/should_compile/Gentle.hs50
1 files changed, 50 insertions, 0 deletions
diff --git a/testsuite/tests/indexed-types/should_compile/Gentle.hs b/testsuite/tests/indexed-types/should_compile/Gentle.hs
new file mode 100644
index 0000000000..a32ac798a0
--- /dev/null
+++ b/testsuite/tests/indexed-types/should_compile/Gentle.hs
@@ -0,0 +1,50 @@
+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies,
+ FlexibleInstances,
+ OverlappingInstances, UndecidableInstances #-}
+
+-- Rather exotic example posted to Haskell mailing list 17 Oct 07
+-- It concerns context reduction and functional dependencies
+
+module FooModule where
+
+class Concrete a b | a -> b where
+ bar :: a -> String
+
+instance (Show a) => Concrete a b where
+ bar = error "urk"
+
+wib :: Concrete a b => a -> String
+wib x = bar x
+
+-- Uncommenting this solves the problem:
+-- instance Concrete Bool Bool
+
+{- This is a nice example of the trickiness of functional dependencies.
+Here's what is happening.
+
+Consider type inference for 'wib'. GHC 6.6 figures out that the call
+of 'bar' gives rise to the constraint (Concrete p q), where x has type
+'p'. Ah, but x must have type 'a', so the constraint is (Concrete a
+q).
+
+Now GHC tries to satisfy (Concrete a q) from (Concrete a b). If it
+applied improvement right away it'd succeed, but sadly it first looks
+at instances declarations. Success: we can get (Concrete a q) from
+(Show a). So it uses the instance decl and now we can't get (Show a)
+from (Concrete a b).
+
+
+OK, found that in GHC 6.6, adding
+ instance Concrete Bool Bool
+fixed the problem. That's weird isn't it? The reason is this. When GHC looks
+at the instance decls, it now sees *two* instance decls matching
+(Concrete a q), and so it declines for now to use either of them
+(since it's not clear which would be the right one). Once it has
+finished with instance decls it tries improvement. And, yes, it now
+sees that q=b, so all is well.
+
+You might say that GHC should use improvement more vigorously, and
+perhaps you'd be right. And indeed the upcoming GHC 6.8 does exactly
+that.
+-}
+