Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {-# LANGUAGE TypeFamilies, ConstraintKinds, GADTs, ScopedTypeVariables #-}
- module CCC where
- import GHC.Exts (Constraint)
- data Uncurried x y where
- Uncurried :: (a -> c) -> (b -> d) -> Uncurried (a,b) (c,d)
- data IsPairPf a where IsPairPf :: IsPairPf (x,y)
- class IsPair a where
- isPairPf :: IsPairPf a
- class RCat cat where
- type CatElt cat a :: Constraint
- cid :: CatElt cat a => cat a a
- (!) :: (CatElt cat a, CatElt cat b, CatElt cat c) => cat b c -> cat a b -> cat a c
- idUncurried :: IsPairPf a -> Uncurried a a
- idUncurried IsPairPf = Uncurried id id
- compUncurried :: Uncurried b c -> Uncurried a b -> Uncurried a c
- compUncurried (Uncurried f1 f2) (Uncurried g1 g2) = Uncurried (f1 . g1) (f2 . g2)
- instance RCat Uncurried where
- type CatElt Uncurried a = IsPair a
- cid = idUncurried isPairPf
- (!) = compUncurried
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement