summaryrefslogtreecommitdiff
path: root/testsuite/tests/codeGen/should_run/cgrun013.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/codeGen/should_run/cgrun013.hs')
-rw-r--r--testsuite/tests/codeGen/should_run/cgrun013.hs78
1 files changed, 78 insertions, 0 deletions
diff --git a/testsuite/tests/codeGen/should_run/cgrun013.hs b/testsuite/tests/codeGen/should_run/cgrun013.hs
new file mode 100644
index 0000000000..4d2f06de6c
--- /dev/null
+++ b/testsuite/tests/codeGen/should_run/cgrun013.hs
@@ -0,0 +1,78 @@
+{-
+From: Kevin Hammond <kh>
+To: partain
+Subject: Nasty Overloading
+Date: Wed, 23 Oct 91 16:19:46 BST
+-}
+module Main where
+
+class Foo a where
+ o1 :: a -> a -> Bool
+ o2 :: a -> Int
+
+-- o2 :: Int
+ -- Lennart: The type of method o2 does not contain the variable a
+ -- (and it must according to line 1 page 29 of the manual).
+
+class Foo tyvar => Bar tyvar where
+ o3 :: a -> tyvar -> tyvar
+
+-- class (Eq a, Foo a) => Baz a where
+class (Ord a, Foo a) => Baz a where
+ o4 :: a -> a -> (String,String,String,a)
+
+instance (Ord a, Foo a) => Foo [a] where
+ o2 x = 100
+ o1 a b = a < b || o1 (head a) (head b)
+
+-- instance Bar [a] where
+instance (Ord a, Foo a) => Bar [a] where
+ o3 x l = []
+ --
+ -- Lennart: I guess the instance declaration
+ -- instance Bar [w] where
+ -- o3 x l = []
+ -- is wrong because to be a Bar you have to be a Foo. For [w] to
+ -- be a Foo, w has to be Ord and Foo. But w is not Ord or Foo in
+ -- this instance declaration so it must be wrong. (Page 31, line
+ -- 7: The context c' must imply ...)
+
+instance Baz a => Baz [a] where
+ o4 [] [] = ("Nil", "Nil", "Nil", [])
+ o4 l1 l2 =
+ (if o1 l1 l2 then "Y" else "N",
+ if l1 == l2 then "Y" else "N",
+-- if o4 (head l1) (head l2) then "Y" else "N",
+ case o4 (head l1) (head l2) of
+ (_,_,_,l3) -> if (o1 (head l1) l3) then "Y" else "N",
+ l1 ++ l2 )
+
+instance Foo Int where
+ o2 x = x
+ o1 i j = i == j
+
+instance Bar Int where
+ o3 _ j = j + 1
+
+instance Baz Int where
+-- o4 i j = i > j
+ o4 i j = (if i>j then "Y" else "Z", "p", "q", i+j)
+--simpl:o4 i j = ("Z", "p", "q", i+j)
+
+{- also works w/ glhc! -}
+
+main = if o4 [1,2,3] [1,3,2::Int] /= ("Y","N","Y",[1,2,3,1,3,2]) then
+ (print "43\n")
+ else (print "144\n")
+
+{- works: glhc
+main = case o4 [1,2,3] [1,3,2::Int] of
+ (s1,s2,s3,x) -> print s1
+
+main = case o4 ([]::[Int]) ([]::[Int]) of
+ (s1,s2,s3,x) -> print s1
+-}
+
+{- simple main: breaks nhc, works w/ glhc
+main = case o4 (3::Int) (4::Int) of (s1,s2,s3,x) -> print s1
+-}