diff options
author | Mart Lubbers | 2015-04-16 21:22:20 +0200 |
---|---|---|
committer | Mart Lubbers | 2015-04-16 21:22:20 +0200 |
commit | 6f604b19d3f5966e5c1d7c4fdf3703bd6ff0861c (patch) | |
tree | 96d580507249f7f58368476d9113007d4afcd748 /fp1/week3/camil/StdStack.icl | |
parent | Added student numbers (diff) |
update to fp2 yay, public and licence
Diffstat (limited to 'fp1/week3/camil/StdStack.icl')
-rw-r--r-- | fp1/week3/camil/StdStack.icl | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/fp1/week3/camil/StdStack.icl b/fp1/week3/camil/StdStack.icl new file mode 100644 index 0000000..dd51a94 --- /dev/null +++ b/fp1/week3/camil/StdStack.icl @@ -0,0 +1,66 @@ +implementation module StdStack
+
+import StdEnv
+import StdList
+
+:: Stack a :== [a]
+
+newStack :: (Stack a)
+newStack = []
+
+push :: a (Stack a) -> (Stack a)
+push a s = [a] ++ s
+
+pop :: (Stack a) -> (Stack a)
+pop [a:s] = s
+pop [] = []
+
+popn :: Int (Stack a) -> (Stack a)
+popn 0 s = s
+popn n s = popn (n-1) (pop s)
+
+pushes :: [a] (Stack a) -> (Stack a)
+pushes [] s = s
+pushes a s = pushes (tl a) (push (hd a) s)
+
+top :: (Stack a) -> a
+top [] = abort "`top s` with s = []"
+top s = hd s
+
+topn :: Int (Stack a) -> [a]
+topn n s
+ | n > length s = abort "`topn n s` with n > length s"
+ | otherwise = take n s
+
+count :: (Stack a) -> Int
+count s = length s
+
+elements :: (Stack a) -> [a]
+elements s = s
+
+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'
+// , "s8 = push 10 s1 = ", s8,'\n'
+// , "s9 = popn 10 s8 = ", s9,'\n'
+// , "sa = topn 5 s4 = ", sa,'\n'
+// , "sb = top s0 = ", sb,'\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
+// s8 = push 10 s1
+// s9 = popn 10 s8
+// sa = topn 5 s4
+// sb = top s0
|