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)
|