aQL'Bool


0. Introduction. Our design for working with data makes use of booleans in the type system. These types do not classify any values but instead are used to parameterise other types with statically known information. For example, we would like to determine statically whether or not two types are equal.

In a dependently typed language, we could work with   Bool  s directly, as type constructors can have as parameters nontype values. In Haskell, however, such parameters must be first-order types. Hence the functions in this module provide a framework for working with booleans in the Haskell type system.

Some day dependently-typed languages will be commonplace and the manipulations of the present module will be unnecessary. Until that day dawns, though, we have to fake the future.

This module has a simple structure.

{-# LINE 22 "aQL'Bool.hweb" #-}
Pragmas
module AQL'Bool where
Definitions

1. First we define a new second-order type,   TBool  , inhabited by the booleans.

Definitions:

{-# LINE 29 "aQL'Bool.hweb" #-}
{- data1 TBool = TTrue | TFalse -}
class TBool b
data TTrue; instance TBool TTrue; ttrue = undefined :: TTrue
data TFalse; instance TBool TFalse; tfalse = undefined :: TFalse

instance Show TTrue where show _ = "TTrue"
instance Show TFalse where show _ = "TFalse"

2. It is easy to implement disjunction and conjunction.

Definitions:

 {-# LINE 39 "aQL'Bool.hweb" #-}
{- compute a \/ b -}
class (TBool a, TBool b) => Disj a b where
  type a :\/: b :: *
  (.\/.) :: a -> b -> a :\/: b
  
instance Disj TTrue TTrue where 
  type TTrue:\/: TTrue = TTrue
  _ .\/. _ = ttrue
  
instance Disj TTrue TFalse where 
  type TTrue:\/: TFalse = TTrue
  _ .\/. _ = ttrue
  
instance Disj TFalse TTrue where 
  type TFalse :\/: TTrue = TTrue
  _ .\/. _ = ttrue
  
instance Disj TFalse TFalse where 
  type TFalse :\/: TFalse = TFalse
  _ .\/. _ = tfalse

{- compute a /\ b -}
class (TBool a, TBool b) => Conj a b where
  type a :/\: b :: *
  (./\.) :: a -> b -> a :/\: b
  
instance Conj TTrue TTrue where 
  type TTrue :/\: TTrue = TTrue
  _ ./\. _ = ttrue
  
instance Conj TTrue TFalse where 
  type TTrue:/\: TFalse = TFalse
  _ ./\. _ = tfalse
  
instance Conj TFalse TTrue where 
  type TFalse :/\: TTrue = TFalse
  _ ./\. _ = tfalse
  
instance Conj TFalse TFalse where 
  type TFalse :/\: TFalse = TFalse
  _ ./\. _ = tfalse

3. The conditional is even easier.

Definitions:

{-# LINE 83 "aQL'Bool.hweb" #-}
class TBool b => If'then'else_ b x y where
  type If'then'else b x y :: *
  if'then'else :: b -> x -> y -> If'then'else b x y
  
instance If'then'else_ TTrue x y where
  type If'then'else TTrue x y = x
  if'then'else _ x _ = x
  
instance If'then'else_ TFalse x y where
  type If'then'else TFalse x y = y
  if'then'else _ _ y = y
  
data l :^ v =  l :^ v

4. Needed language extensions.

Pragmas:

{-# LINE 85 "aQL'Bool.hweb" #-}
{-# LANGUAGE 
  TypeFamilies,
  TypeOperators,
  MultiParamTypeClasses,
  FunctionalDependencies, 
  EmptyDataDecls, 
  FlexibleInstances,
  FlexibleContexts,  
  UndecidableInstances,
  TypeSynonymInstances  #-}


5. Names of the sections.
Definitions
Pragmas