src/Data/Machine/Is.hs

{-# LANGUAGE GADTs, TypeFamilies #-}
-----------------------------------------------------------------------------
-- |
-- Module : Data.Machine.Is
-- Copyright : (C) 2012 Edward Kmett
-- License : BSD-style (see the file LICENSE)
--
-- Maintainer : Edward Kmett <ekmett@gmail.com>
-- Stability : provisional
-- Portability : GADTs, Type Families
--
----------------------------------------------------------------------------
module Data.Machine.Is
 ( Is(..)
 ) where

import Control.Category
import Data.Monoid

-- | Witnessed type equality
data Is a b where
 Refl :: Is a a

instance Show (Is a b) where
 showsPrec _ Refl = showString "Refl"

instance Eq (Is a b) where
 Refl == Refl = True
 {-# INLINE (==) #-}

instance Ord (Is a b) where
 Refl `compare` Refl = EQ
 {-# INLINE compare #-}

instance (a ~ b) => Monoid (Is a b) where
 mempty = Refl
 {-# INLINE mempty #-}
 mappend Refl Refl = Refl
 {-# INLINE mappend #-}

instance (a ~ b) => Read (Is a b) where
 readsPrec d = readParen (d > 10) (\r -> [(Refl,s) | ("Refl",s) <- lex r ])

instance Category Is where
 id = Refl
 {-# INLINE id #-}
 Refl . Refl = Refl
 {-# INLINE (.) #-}

AltStyle によって変換されたページ (->オリジナル) /