data-category-0.2.0: Data/Category/Boolean.hs
{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, GADTs, EmptyDataDecls, FlexibleInstances #-}
-----------------------------------------------------------------------------
-- |
-- Module : Data.Category.Boolean
-- Copyright : (c) Sjoerd Visscher 2010
-- License : BSD-style (see the file LICENSE)
--
-- Maintainer : sjoerd@w3future.com
-- Stability : experimental
-- Portability : non-portable
--
-- /2/, or the Boolean category.
-- It contains 2 objects, one for true and one for false.
-- It contains 3 arrows, 2 identity arrows and one from false to true.
-----------------------------------------------------------------------------
module Data.Category.Boolean where
import Prelude hiding ((.), id, Functor)
import Data.Category
import Data.Category.Limit
data BF
data BT
data Boolean a b where
IdFls :: Boolean BF BF
FlsTru :: Boolean BF BT
IdTru :: Boolean BT BT
-- | @Boolean@ is the category with true and false as objects, and an arrow from false to true.
instance Category Boolean where
data Obj Boolean a where
Fls :: Obj Boolean BF
Tru :: Obj Boolean BT
src IdFls = Fls
src FlsTru = Fls
src IdTru = Tru
tgt IdFls = Fls
tgt FlsTru = Tru
tgt IdTru = Tru
id Fls = IdFls
id Tru = IdTru
IdFls . IdFls = IdFls
FlsTru . IdFls = FlsTru
IdTru . FlsTru = FlsTru
IdTru . IdTru = IdTru
_ . _ = error "Other combinations should not type check"
-- | False is the initial object in the Boolean category.
instance HasInitialObject Boolean where
type InitialObject Boolean = BF
initialObject = Fls
initialize Fls = IdFls
initialize Tru = FlsTru
-- | True is the terminal object in the Boolean category.
instance HasTerminalObject Boolean where
type TerminalObject Boolean = BT
terminalObject = Tru
terminate Fls = FlsTru
terminate Tru = IdTru
type instance BinaryProduct Boolean BF BF = BF
type instance BinaryProduct Boolean BF BT = BF
type instance BinaryProduct Boolean BT BF = BF
type instance BinaryProduct Boolean BT BT = BT
instance HasBinaryProducts Boolean where
product Fls Fls = Fls
product Fls Tru = Fls
product Tru Fls = Fls
product Tru Tru = Tru
proj Fls Fls = (IdFls , IdFls)
proj Fls Tru = (IdFls , FlsTru)
proj Tru Fls = (FlsTru, IdFls)
proj Tru Tru = (IdTru , IdTru)
IdFls &&& IdFls = IdFls
IdFls &&& FlsTru = IdFls
FlsTru &&& IdFls = IdFls
FlsTru &&& FlsTru = FlsTru
IdTru &&& IdTru = IdTru
_ &&& _ = error "Other combinations should not type check"
type instance BinaryCoproduct Boolean BF BF = BF
type instance BinaryCoproduct Boolean BF BT = BT
type instance BinaryCoproduct Boolean BT BF = BT
type instance BinaryCoproduct Boolean BT BT = BT
instance HasBinaryCoproducts Boolean where
coproduct Fls Fls = Fls
coproduct Fls Tru = Tru
coproduct Tru Fls = Tru
coproduct Tru Tru = Tru
inj Fls Fls = (IdFls , IdFls)
inj Fls Tru = (FlsTru, IdTru)
inj Tru Fls = (IdTru , FlsTru)
inj Tru Tru = (IdTru , IdTru)
IdFls ||| IdFls = IdFls
FlsTru ||| FlsTru = FlsTru
FlsTru ||| IdTru = IdTru
IdTru ||| FlsTru = IdTru
IdTru ||| IdTru = IdTru
_ ||| _ = error "Other combinations should not type check"
instance Show (Obj Boolean a) where
show Fls = "Fls"
show Tru = "Tru"