summaryrefslogtreecommitdiff
path: root/testsuite/tests/typecheck/should_fail/tcfail068.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/typecheck/should_fail/tcfail068.hs')
-rw-r--r--testsuite/tests/typecheck/should_fail/tcfail068.hs90
1 files changed, 90 insertions, 0 deletions
diff --git a/testsuite/tests/typecheck/should_fail/tcfail068.hs b/testsuite/tests/typecheck/should_fail/tcfail068.hs
new file mode 100644
index 0000000000..beae0f8359
--- /dev/null
+++ b/testsuite/tests/typecheck/should_fail/tcfail068.hs
@@ -0,0 +1,90 @@
+-- !! Make sure that state threads don't escape
+-- !! (example from Neil Ashton at York)
+--
+module ShouldFail where
+
+import GHC.Arr
+import Control.Monad.ST ( runST )
+
+type IndTree s t = STArray s (Int,Int) t
+
+itgen :: Constructed a => (Int,Int) -> a -> IndTree s a
+itgen n x =
+ runST (
+ newSTArray ((1,1),n) x)
+
+itiap :: Constructed a => (Int,Int) -> (a->a) -> IndTree s a -> IndTree s a
+itiap i f arr =
+ runST (
+ readSTArray arr i >>= \val ->
+ writeSTArray arr i (f val) >>
+ return arr)
+
+itrap :: Constructed a => ((Int,Int),(Int,Int)) -> (a->a) -> IndTree s a -> IndTree s a
+itrap ((i,k),(j,l)) f arr = runST(itrap' i k)
+ where
+ itrap' i k = if k > l then return arr
+ else (itrapsnd i k >>
+ itrap' i (k+1))
+ itrapsnd i k = if i > j then return arr
+ else (readSTArray arr (i,k) >>= \val ->
+ writeSTArray arr (i,k) (f val) >>
+ itrapsnd (i+1) k)
+
+itrapstate :: Constructed b => ((Int,Int),(Int,Int)) -> (a->b->(a,b)) -> ((Int,Int)->c->a) ->
+ (a->c) -> c -> IndTree s b -> (c, IndTree s b)
+itrapstate ((i,k),(j,l)) f c d s arr = runST(itrapstate' i k s)
+ where
+ itrapstate' i k s = if k > l then return (s,arr)
+ else (itrapstatesnd i k s >>= \(s,arr) ->
+ itrapstate' i (k+1) s)
+ itrapstatesnd i k s = if i > j then return (s,arr)
+ else (readSTArray arr (i,k) >>= \val ->
+ let (newstate, newval) = f (c (i,k) s) val
+ in writeSTArray arr (i,k) newval >>
+ itrapstatesnd (i+1) k (d newstate))
+
+-- stuff from Auxiliary: copied here (partain)
+
+sap :: (a->b) -> (c,a) -> (c,b)
+sap f (x,y) = (x, f y)
+
+fap :: (a->b) -> (a,c) -> (b,c)
+fap f (x,y) = (f x, y)
+
+nonempty :: [a] -> Bool
+nonempty [] = False
+nonempty (_:_) = True
+
+-- const :: a -> b -> a
+-- const k x = k
+
+-- id :: a -> a
+-- id x = x
+
+compose :: [a->a] -> a -> a
+compose = foldr (.) id
+
+class Constructed a where
+ normal :: a -> Bool
+
+instance Constructed Bool where
+ normal True = True
+ normal False = True
+
+instance Constructed Int where
+ normal 0 = True
+ normal n = True
+
+instance (Constructed a, Constructed b) => Constructed (a,b) where
+ normal (x,y) = normal x && normal y
+
+-- pair :: (Constructed a, Constructed b) => a -> b -> (a,b)
+-- pair x y | normal x && normal y = (x,y)
+
+instance Constructed (Maybe a) where
+ normal Nothing = True
+ normal (Just _) = True
+
+just :: Constructed a => a -> Maybe a
+just x | normal x = Just x