Paste number 31437: type trees

Paste number 31437: type trees
Pasted by: sjanssen
When:2 years, 6 months ago
Share:Tweet this! | http://paste.lisp.org/+O99
Channel:#haskell
Paste contents:
Raw Source | XML | Display As
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}

newtype Succ a = Succ a
data Zero = Zero

class IfLess x y a b r | x y a b -> r
instance (IfLess x y a b r) => IfLess (Succ x) (Succ y) a b r
instance IfLess Zero (Succ y) a b a
instance IfLess (Succ x) Zero a b b
instance IfLess Zero Zero a b b

data Branch l m r = Branch l m r
data Leaf = Leaf

class Insert t x u | t x -> u
instance Insert Leaf x (Branch Leaf x Leaf)
instance (Insert l x l', Insert r x r', IfLess x m (Branch l' m r) (Branch l m r') u) => Insert (Branch l m r) x u

insert :: (Insert t x u) => t -> x -> u
insert = undefined

-- tests:
t1 :: Branch Leaf (Succ (Succ Zero)) Leaf
t1 = insert Leaf (Succ (Succ Zero))
t2 :: Branch (Branch Leaf (Succ Zero) Leaf) (Succ (Succ Zero)) Leaf
t2 = insert t1 (Succ Zero)
t3 :: Branch (Branch Leaf (Succ Zero) Leaf)
       (Succ (Succ Zero))
       (Branch Leaf (Succ (Succ (Succ (Succ Zero)))) Leaf)
t3 = insert t2 $ Succ $ Succ $ Succ $ Succ Zero
t4 :: Branch (Branch (Branch Leaf Zero Leaf) (Succ Zero) Leaf)
       (Succ (Succ Zero))
       (Branch Leaf (Succ (Succ (Succ (Succ Zero)))) Leaf)
t4 = insert t3 $ Zero
t5 :: Branch (Branch (Branch Leaf Zero Leaf) (Succ Zero) Leaf)
       (Succ (Succ Zero))
       (Branch (Branch Leaf (Succ (Succ (Succ Zero))) Leaf)
	       (Succ (Succ (Succ (Succ Zero))))
	       Leaf)
t5 = insert t4 $ Succ $ Succ $ Succ $ Zero

This paste has no annotations.

Colorize as:
Show Line Numbers

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.