blob: 82c6f49e33fec89b71d3d789b87dbe76f808e42e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
{-# LANGUAGE ImplicitParams, TypeSynonymInstances, FlexibleInstances #-}
-- Class ops that bind no new type variables
module Main where
import Data.List( sort )
just = [Just "fred",Just "bill"]
main = do { putStrLn (let ?p = "ok1" in fc1);
putStrLn (let ?p = "ok2" in fc2);
putStrLn (show (fd1 just)) ;
putStrLn (show (fd2 just)) }
-- This class has no tyvars in its class op context
-- One uses a newtype, the other a data type
class C1 a where
fc1 :: (?p :: String) => a;
class C2 a where
fc2 :: (?p :: String) => a;
opc :: a
instance C1 String where
fc1 = ?p;
instance C2 String where
fc2 = ?p;
opc = "x"
-- This class constrains no new type variables in
-- its class op context
class D1 a where
fd1 :: (Ord a) => [a] -> [a]
class D2 a where
fd2 :: (Ord a) => [a] -> [a]
opd :: a
instance D1 (Maybe a) where
fd1 xs = sort xs
instance D2 (Maybe a) where
fd2 xs = sort xs
opd = Nothing
|