summaryrefslogtreecommitdiff
path: root/testsuite/tests/typecheck/should_run/tcrun044.hs
blob: 3e2f99381cb542bf1356a355db8ac277b6202cbe (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
{-# LANGUAGE TypeFamilies, ConstraintKinds #-}

import qualified Data.Set as S
import GHC.Exts ( Constraint )

class RMonad m where
    type RMonadCtxt m a :: Constraint
    returnR :: (RMonadCtxt m a) => a -> m a
    bindR :: (RMonadCtxt m a, RMonadCtxt m b) => m a -> (a -> m b) -> m b


instance RMonad [] where
    type RMonadCtxt [] a = ()
    returnR x = [x]
    bindR = flip concatMap


instance RMonad S.Set where
    type RMonadCtxt S.Set a = Ord a
    returnR x = S.singleton x
    bindR mx fxmy = S.fromList [y | x <- S.toList mx, y <- S.toList (fxmy x)]


main = do
    print $ (returnR 1 ++        returnR 2) `bindR`
            (\x -> returnR (x + 1) ++        returnR (x + 2))
    print $ (returnR 1 `S.union` returnR 2) `bindR`
            (\x -> returnR (x + 1) `S.union` returnR (x + 2))