From 6f604b19d3f5966e5c1d7c4fdf3703bd6ff0861c Mon Sep 17 00:00:00 2001 From: Mart Lubbers Date: Thu, 16 Apr 2015 21:22:20 +0200 Subject: update to fp2 yay, public and licence --- fp1/week3/mart/StdStack.icl | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 fp1/week3/mart/StdStack.icl (limited to 'fp1/week3/mart/StdStack.icl') diff --git a/fp1/week3/mart/StdStack.icl b/fp1/week3/mart/StdStack.icl new file mode 100644 index 0000000..13220e1 --- /dev/null +++ b/fp1/week3/mart/StdStack.icl @@ -0,0 +1,57 @@ +implementation module StdStack + +import StdEnv + +:: Stack a = Stack [a] + +newStack :: Stack a +newStack = Stack [] + +push :: a (Stack a) -> Stack a +push x (Stack xs) = Stack [x:xs] + +pushes :: [a] (Stack a) -> Stack a +pushes [] (Stack s) = Stack s +pushes [x:xs] (Stack s) = pushes xs (push x (Stack s)) + +pop :: (Stack a) -> Stack a +pop (Stack []) = abort "Can't pop from empty stack..." +pop (Stack [x:xs]) = Stack xs + +popn :: Int (Stack a) -> Stack a +popn 0 s = s +popn n s = popn (n-1) (pop s) + +top :: (Stack a) -> a +top (Stack []) = abort "Can't give top of empty stack..." +top (Stack [x:_]) = x + +topn :: Int (Stack a) -> [a] +topn 0 _ = [] +topn n x = [top x:topn (n-1) (pop x)] + +elements :: (Stack a) -> [a] +elements (Stack s) = s + +count :: (Stack a) -> Int +count (Stack []) = 0 +count (Stack [_:xs]) = 1 + count (Stack xs) + +Start = ( "s0 = newStack = ", s0,'\n' + , "s1 = push 1 s0 = ", s1,'\n' + , "s2 = pushes [2..5] s1 = ",s2,'\n' + , "s3 = pop s2 = ", s3,'\n' + , "s4 = popn 3 s3 = ", s4,'\n' + , "s5 = top s4 = ", s5,'\n' + , "s6 = topn 3 s2 = ", s6,'\n' + , "s7 = elements s2 = ", s7,'\n' + ) +where + s0 = newStack + s1 = push 1 s0 + s2 = pushes [2..5] s1 + s3 = pop s2 + s4 = popn 3 s3 + s5 = top s4 + s6 = topn 3 s2 + s7 = elements s2 -- cgit v1.2.3