type-level-0.1: src/Data/TypeLevel/Num/Reps.hs
{-# LANGUAGE EmptyDataDecls, TypeOperators, DeriveDataTypeable,
ScopedTypeVariables, TemplateHaskell #-}
-----------------------------------------------------------------------------
-- |
-- Module : Data.TypeLevel.Num.Reps
-- Copyright : (c) 2008 Alfonso Acosta, Oleg Kiselyov, Wolfgang Jeltsch
-- and KTH's SAM group
-- License : BSD-style (see the file LICENSE)
--
-- Maintainer : alfonso.acosta@gmail.com
-- Stability : experimental
-- Portability : non-portable (TypeOperators)
--
-- Type-level numerical representations. Currently, only decimals are
-- supported.
--
----------------------------------------------------------------------------
module Data.TypeLevel.Num.Reps (
-- * Decimal representation
-- $decdescription
-- ** Digits
D0, D1, D2, D3, D4, D5, D6, D7, D8, D9,
-- ** Connective
(:*)(..),
) where
import Data.Typeable (Typeable)
import Language.Haskell.TH.Syntax (Lift(..))
-------------------------
-- Decimal Representation
-------------------------
-- $decdescription
-- Decimals are represented using a different type (@Dx@) for each digit and a
-- binary infix connective (@:*@) to enable forming arbitrary precision
-- multidigit numbers. For example @D0@ represents number 0, @D4 :* D2@
-- represents number 42, @D1 :* D0 :* D0@ represents 100, etc ... Obviously,
-- negative numbers cannot be represented.
-- | Decimal digit zero
data D0 deriving Typeable
instance Show D0 where show _ = "0"
instance Lift D0 where lift _ = [| undefined :: D0 |]
-- | Decimal digit one
data D1 deriving Typeable
instance Show D1 where show _ = "1"
instance Lift D1 where lift _ = [| undefined :: D1 |]
-- | Decimal digit two
data D2 deriving Typeable
instance Show D2 where show _ = "2"
instance Lift D2 where lift _ = [| undefined :: D2 |]
-- | Decimal digit three
data D3 deriving Typeable
instance Show D3 where show _ = "3"
instance Lift D3 where lift _ = [| undefined :: D3 |]
-- | Decimal digit four
data D4 deriving Typeable
instance Show D4 where show _ = "4"
instance Lift D4 where lift _ = [| undefined :: D4 |]
-- | Decimal digit five
data D5 deriving Typeable
instance Show D5 where show _ = "5"
instance Lift D5 where lift _ = [| undefined :: D5 |]
-- | Decimal digit six
data D6 deriving Typeable
instance Lift D6 where lift _ = [| undefined :: D6 |]
instance Show D6 where show _ = "6"
-- | Decimal digit seven
data D7 deriving Typeable
instance Show D7 where show _ = "7"
instance Lift D7 where lift _ = [| undefined :: D7 |]
-- | Decimal digit eight
data D8 deriving Typeable
instance Show D8 where show _ = "8"
instance Lift D8 where lift _ = [| undefined :: D8 |]
-- | Decimal digit nine
data D9 deriving Typeable
instance Show D9 where show _ = "9"
instance Lift D9 where lift _ = [| undefined :: D9 |]
-- | Connective to glue digits together.
-- For example, @D1 :* D0 :* D0@ represents the decimal number 100
data a :* b = a :* b deriving Typeable
instance (Show a, Show b) => Show (a :* b) where
show _ = (show (undefined :: a)) ++ (show (undefined :: b))
instance (Lift a, Lift b) => Lift (a :* b) where
lift _ = [| $(lift (undefined ::a)) :* $(lift (undefined :: b) ) |]