[added more tests mail@stefanwehr.de**20050525051713] { adddir ./tests/examples adddir ./tests/well-formed/should_pass addfile ./tests/examples/HList.phc hunk ./tests/examples/HList.phc 1 - +data HNil = HNil; +data HCons e l = HCons e l; + +class HList l where {} +instance HList HNil where {} +instance HList l => HList (HCons e l) where {} + +{- does not work atm, need multi-parameter typeclasses +class HAppendC l l' where { + type HAppend l l'; + hAppend :: l -> l' -> HAppend l l'; +} +-} addfile ./tests/examples/TypeSaveEvaluator.phc hunk ./tests/examples/TypeSaveEvaluator.phc 1 +data Lit i = Lit i; +data Succ t = Succ t; +data IsZero t = IsZero t; +data If tc tt te = If tc tt te; + +class Term a where { + type Result a; +} + +instance Term Bool where { + type Result Bool = Bool; +} + +instance Term (Lit Int) where { + type Result (Lit Int) = Int; +} + +instance Term a, Result a = Int => Term (Succ a) where { + type Result (Succ a) = Int; +} + +instance Term a, Result a = Int => Term (IsZero a) where { + type Result (IsZero a) = Bool; +} + +instance Term a, Term b, Term c, + Result a = Result b, Result c = Bool + => Term (If c a b) where { + type Result (If c a b) = Result a; +} + +class Term a => Eval a where { + eval :: a -> Result a; +} + +instance Eval Bool where { + eval b = b; +} + +instance Eval (Lit Int) where { + eval x = case x of Lit i -> i;; +} + +instance Eval a, Result a = Int => Eval (Succ a) where { + eval x = case x of Succ i -> eval i + 1;; +} + +instance Eval a, Result a = Int => Eval (IsZero a) where { + eval x = case x of IsZero i -> eval i == 0;; +} + +instance Eval a, Eval b, Eval c, + Result a = Result b, Result c = Bool + => Eval (If c a b) where { + eval x = case x of If c t1 t2 -> if eval c then eval t1 else eval t2;; +} + +foo :: Int -> Int; +foo n = eval (If (IsZero (Succ (Lit n))) (Lit 42) (Lit n)); addfile ./tests/well-formed/should_fail/missing_superclass_instance.err hunk ./tests/well-formed/should_fail/missing_superclass_instance.err 1 +no instance for superclass A found when checking instance declaration B (D a[3]) addfile ./tests/well-formed/should_fail/missing_superclass_instance.phc hunk ./tests/well-formed/should_fail/missing_superclass_instance.phc 1 +data D a = D a; + +class A a where { +} + +class A b => B b where { +} + +instance A a => A (D a) where { +} + +instance B (D a) where { +} + + addfile ./tests/well-formed/should_pass/000.out addfile ./tests/well-formed/should_pass/000.phc hunk ./tests/well-formed/should_pass/000.phc 1 +data D a = D a; + +class A a where { +} + +class A b => B b where { +} + +instance A a => A (D a) where { +} + +instance A a => B (D a) where { +} + + }