packages feed

CPL-0.0.5: src/Variance.hs

-----------------------------------------------------------------------------
-- |
-- Module      :  Variance
-- Copyright   :  (c) Masahiro Sakai 2009
-- License     :  BSD-style
-- 
-- Maintainer  :  masahiro.sakai@gmail.com
-- Stability   :  provisional
-- Portability :  portable
--
-- Variance calculation.
--
-----------------------------------------------------------------------------

module Variance
    ( Variance(..)
    , top
    , bottom
    , join
    , meet
    , joinL
    , meetL
    , mult
    , mnemonic
    ) where

data Variance
    = Covariance     --- +
    | Contravariance --- -
    | FixedVariance  --- T
    | FreeVariance   --- ⊥
    deriving (Show,Read,Eq)

mnemonic :: Variance -> String
mnemonic Covariance     = "+"
mnemonic Contravariance = "-"
mnemonic FixedVariance  = "T"
mnemonic FreeVariance   = "_|_"

bottom, top :: Variance
bottom = FreeVariance
top    = FixedVariance

join,meet :: Variance -> Variance -> Variance
join a b | a==b            = a
         | a==FreeVariance = b
         | b==FreeVariance = a
         | otherwise       = FixedVariance
meet a b | a==b             = a
         | a==FixedVariance = b
         | b==FixedVariance = a
         | otherwise        = FreeVariance

joinL,meetL :: [Variance] -> Variance
joinL = foldl join bottom
meetL = foldl meet top

{-

・|⊥|+ |- |T
--+--+--+--+--
⊥|⊥|⊥|⊥|⊥
+ |⊥|+ |- |T
- |⊥|- |+ |T
T |⊥|T |T |T

-}
mult :: Variance -> Variance -> Variance
mult _ FreeVariance  = FreeVariance
mult FreeVariance _  = FreeVariance
mult _ FixedVariance = FixedVariance
mult FixedVariance _ = FixedVariance
mult a Covariance    = a
mult Covariance a    = a
mult Contravariance Contravariance = Covariance