--
import Trex {- data Term e = Z (Rec (z :: Int | e) -> Int) | W (Rec (w :: Int | e) -> Int) | Int Int | Plus (Term e ) (Term e) -} data Term e = Z (e -> Int) | Int Int | Plus (Term e ) (Term e) eval (Int n) env = n eval (Plus x y) env = (eval x env) + (eval y env) ex1 = ( a= 4, b= "z") ex2 = ( a = True, c = [1,2,3]) ex3 = #a ex1 ex4 = #a ex2 {- Main> :t ex3 ex3 :: Integer Main> :t ex4 ex4 :: Bool Main> :t ex1 ex1 :: Rec (a :: Integer, b :: [Char]) Main> :t #a #a :: a\a => Rec (a :: b | a) -> b -} ex5 = ( name = "tim", age = 12 ) ex6 = (age = 12, name = "tim") {- Main> show ex5 "(age=12, name=\"tim\")" Main> show ex6 "(age=12, name=\"tim\")" Main> ex5==ex6 Bool_True -} ------- Pattern matching f (name = x, age = y) = y +1 g ( a = x ) = x {- Main> :t f f :: Num a => Rec (name :: b, age :: a) -> a Main> f ex5 13 Main> g ex1 ERROR: Type error in application *** Expression : g ex1 *** Term : ex1 *** Type : Rec (a :: Integer, b :: [Char]) *** Does not match : Rec (a :: Integer) *** Because : rows are not compatible -} --------------- Extensible records ----------- h1 z = ( a = True | z ) h2 z = ( c = 24, d= True | z ) {- Main> show (h1 ex5) "(a=True, age=12, name=\"tim\")" Main> show (h2 ex1) "(a=4, b=\"z\", c=24, d=True)" Main> h1 ex1 ERROR: Cannot satisfy constraint (a :: Integer, b :: [Char])\a Main> h2 (c=False) ERROR: Cannot satisfy constraint (c :: Bool)\c -} h3 (a = _ | z ) w = (b = True , red = w | z) {- Main> :t #a #a :: a\a => Rec (a :: b | a) -> b Main> :t h1 h1 :: a\a => Rec a -> Rec (a :: Bool | a) h3 :: (a\a, a\b, a\red) => Rec (a :: b | a) -> c -> Rec (b :: Bool, red :: c | a) -} ex7 = (a = 1, b = True, c = [1], d ="z", e = 23.1 ) removeac ( a = _, c = _ | z ) = z {- Main> show(removeac ex7) "(b=True, d=\"z\", e=23.1)" -} j (name=x, age = w | z ) = (w+1,(name = x |z)); {- Main> :t j j :: (a\name, a\age, Num b) => Rec (name :: c, age :: b | a) -> (b,Rec (name :: c | a)) -} --