{- | Provide the basic MEP data structures -} {-# LANGUAGE GADTs #-} module MEP.Types where import qualified Data.Vector as V type Population a = [Chromosome a] -- | A chromosome is a vector of genes type Chromosome a = V.Vector (Gene a Int) -- | Either a terminal symbol or a three-address code (a function -- and two pointers) data Gene a i where -- Terminal symbol: constant C :: a -> Gene a i -- Terminal symbol: variable Var :: Int -> Gene a i -- Operation Op :: F a -> i -> i -> Gene a i instance (Show a, Show i) => Show (Gene a i) where show (C c) = show c show (Var n) = "v" ++ show n show (Op (s, _) i1 i2) = show s ++ " " ++ show i1 ++ " " ++ show i2 -- | A function and its symbolic representation type F a = (Char, a -> a -> a)