{- polyrec.safe ------------ Polymorphic recursion on regions. -} -- Heap integers data type -- (@ rho annotations are ignored and they will be deprecated in a near future) data Ent @ rho = E Int @ rho -- Heap integers addition (E x) ++ (E y) = E (x+y) {- After region inference (pretty-printed form): ++ :: Ent @ rho1 -> Ent @ rho2 -> rho3 -> Ent @ rho3 ++ (E x) (E y) @ r = E (+ x y) @ r -} concat [] ys = ys@ concat (x:xs) ys = let v = x:concat xs ys in v@ {- After region inference (pretty-printed form): concat :: [a] @ rho1 -> [a] @ rho2 -> rho3 -> [a] @ rho3 concat [] ys @ r = ys @ r concat (: x xs) ys @ r = let v = (x : (concat xs ys @ self)) @ self in v @ r -} fib (E 0) = E 1 fib (E 1) = E 1 fib (E n) = (fib (E (n-1))) ++ (fib (E (n-2))) {- After region inference (pretty-printed form): fib :: Ent @ rho1 -> rho2 -> Ent @ rho2 fib (E 0) @ r = (E 1) @ r fib (E 1) @ r = (E 1) @ r fib (E n) @ r = ((fib (E (n-1)@ self) @ self) ++ (fib (E (n-1)@ self) @ self))@ r -} sumList xs = case xs of [] -> [] (x:xx) -> case xx of [] -> ((x@):[]) (y:_) -> (x ++ y) : sumList xx {- sumList :: [Ent @ rho1] @ rho2 -> rho3 -> rho4 -> [Ent @ rho3] @ rho4 sumList xs @ r1 r2 = case xs of [] -> [] @ r2 (x:xx) -> case xx of [] -> ((x@r1):[]@r2)@ r2 (y:_) -> ((x ++ y) @ r1 : sumList xx @ r1 r2) @ r2 -} sumList' (x:[]) = (x:[]) sumList' (x:(y:ys)) = (x++y):sumList' (y:ys) {- sumList' :: [Ent @ rho1] @ rho2 -> rho1 -> rho2 -> rho3 -> [Ent @ rho1] @ rho3 sumList' (x:[]) @ r1 r2 r3 = (x : []@ r3)@ r3 sumList' (x:(y:ys)) @ r1 r2 r3 = ((x ++ y)@ r1 : (sumList' (y:ys)@ r2 @ r1 r2 r3) @ r3 -} pascal 0 = (E 1) : [] pascal n = (E 1) : sumList (pascal (n-1)) {- pascal :: Int -> rho1 -> rho2 -> [Ent @ rho1] @ rho2 pascal 0 @ r1 r2 = ((E 1 @ r1):[] @ r2) @ r2 pascal n @ r1 r2 = ((E 1 @ r1): sumList (pascal (n-1) @ self self) @ r1 r2) @ r2 -} g xs ys = let z = 1:xs in 0 g xs ys = let z = 1:ys in 0 g xs ys = g ys xs {- g :: [Int] @ rho1 -> [Int] @ rho2 -> rho1 -> rho2 -> Int g xs ys @ r1 r2 = let z = (1:xs) @ r1 in 0 g xs ys @ r1 r2 = let z = (1:ys) @ r2 in 0 g xs ys @ r1 r2 = g ys xs @ r2 r1 -} h xs ys = 0:ys h xs ys = h ys xs {- h :: [Int] @ rho1 -> [Int] @ rho1 -> rho1 -> [Int] @ rho1 h xs ys @ r1 = (0:ys) @ r1 h xs ys @ r1 = h ys xs @ r1 -} -- Dummy main expression 2+3