diff options
Diffstat (limited to 'testsuite/tests/typecheck/should_run/tcrun010.hs')
-rw-r--r-- | testsuite/tests/typecheck/should_run/tcrun010.hs | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/testsuite/tests/typecheck/should_run/tcrun010.hs b/testsuite/tests/typecheck/should_run/tcrun010.hs new file mode 100644 index 0000000000..7621f4d4e0 --- /dev/null +++ b/testsuite/tests/typecheck/should_run/tcrun010.hs @@ -0,0 +1,44 @@ +{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-} + +-- !!! Functional dependencies +-- This one gave "zonkIdOcc: FunDep_a11w" in earlier days + +module Main (main) where + +data ERR a b = EOK a | ERR b deriving (Show) +data Error = No | Notatall deriving (Show, Eq) + + +class MonadErr m e | m -> e where + aerturn :: e -> m a + areturn :: a -> m a + acatch :: a -> (a -> m b) -> (e -> m b) -> m b + (>>>=) :: m a -> (a -> m b) -> m b + (>>>) :: m a -> m b -> m b + +data BP a = BP (Int -> (ERR a Error, Int)) + +instance MonadErr BP Error where + aerturn k = BP $ \s -> (ERR k, s) + areturn k = BP $ \s -> (EOK k, s) + acatch k try handler = BP $ \s -> let BP try' = try k + (r,s1) = try' s + (BP c2, s2) = case r of + EOK r -> (areturn r, s1) + ERR r -> (handler r, s) + in c2 s2 + a >>> b = a >>>= \_ -> b + + (BP c1) >>>= fc2 = BP $ \s0 -> let (r,s1) = c1 s0 + BP c2 = case r of + EOK r -> fc2 r + ERR r -> BP (\s -> (ERR r, s)) + in c2 s1 + +run_BP :: Int -> BP a -> (ERR a Error, Int) +run_BP st (BP bp) = bp st + +foo :: (ERR Int Error, Int) +foo = run_BP 111 (aerturn No) + +main = print (show foo) |