summaryrefslogtreecommitdiff
path: root/testsuite/tests/ghc-regress/typecheck/should_compile/tc197.hs
blob: 40b9aeca7e74fb106aa3d494e122cfeaf8d40dab (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
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies,
             FlexibleInstances, FlexibleContexts #-}

-- Another dependency analysis test
-- Notice that 'a' and 'b' are mutually recursive, 
-- but have different contexts. 
--
-- This is the program submitted by Robert van Herk [rherk@cs.uu.nl]
-- to motivate the refined dependency analysis.

module ShouldCompile where
import Data.IORef

class MyReader r v | r -> v where
  myRead :: r -> IO v

data R v = R (IORef v)
instance MyReader (R v) v where
  myRead (R v) =
    do v <- readIORef v
       return v


a :: IO ()
a =
  do r <- createReader
     b r

b :: MyReader r Int => r -> IO ()
b r =
  do i <- myRead r
     if i > 10
       then a
       else putStrLn (show i)

createReader :: IO (R Int)
createReader =
  do ref <- newIORef 0
     return (R ref)