
Hello, I'm trying to use a type class to select an element from a list. I would like to have a String "CC" as a value for l10'. {-# LANGUAGE MultiParamTypeClasses, GADTs,FlexibleInstances, DataKinds ,TypeFamilies, KindSignatures, FlexibleContexts, OverlappingInstances, StandaloneDeriving, UndecidableInstances #-} import Data.Nat import Data.Monoid data family X (n::Nat) :: * data L (n::Nat) where Q :: (Monoid (X n), Show (X n)) => L (Succ n) -> X n -> L n E :: Monoid (X n) => L n deriving instance Show (L n) data instance X n = String String instance Monoid (X n) where String x `mappend` String y = String $ x `mappend` y mempty = String "" deriving instance Show (X n) class Compose n n' where compose :: L n -> L n -> X n' instance Compose n n where compose (Q _ x) (Q _ y) = x `mappend` y compose _ _ = mempty instance Compose n n' where compose (Q x _) (Q y _) = compose x y compose _ _ = mempty l0 :: L Zero l0 = Q (Q E $ String "C") $ String "A" l0' :: L Zero l0' = Q (Q E $ String "C") $ String "B" l10' :: X (Succ Zero) l10' = compose l0 l0' l00' :: X Zero l00' = compose l0 l0' {- *Main> l00' String "AB" *Main> l10' String "" -} Thanks for help. paolino