added assignment 7 ex 1
This commit is contained in:
		
							
								
								
									
										35
									
								
								src/Assignment7/Ex1.sc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/Assignment7/Ex1.sc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| trait Stack[+A] { | ||||
|     def push[B >: A](elem: B) : Stack[B] = ElemStack(elem, this) | ||||
|     def top: A | ||||
|     def pop: Stack[A] | ||||
| } | ||||
|  | ||||
| case class EmptyStack[+A]() extends Stack[A] { | ||||
|   override def top: A = throw new IndexOutOfBoundsException("Stack is empty") | ||||
|   override def pop: Stack[A] = this | ||||
| } | ||||
|  | ||||
| case class ElemStack[+A](elmt: A, base: Stack[A]) extends Stack[A] { | ||||
|   override def top: A = elmt | ||||
|   override def pop: Stack[A] = base | ||||
|   override def toString: String = elmt.toString + "," + base.toString | ||||
| } | ||||
|  | ||||
| // Construction, pop and toString | ||||
| val a = EmptyStack().push("hello").push("world").push("it's fun").pop | ||||
| assert(a.toString() == "world,hello,EmptyStack()") | ||||
|  | ||||
| // Getting top | ||||
| val b = EmptyStack().push(1).push(3) | ||||
| assert(b.top == 3) | ||||
|  | ||||
| // Variance checks | ||||
| class Foo | ||||
| class Bar extends Foo | ||||
| val c: Stack[Bar] = EmptyStack().push(new Bar()).push(new Bar()) | ||||
| assert(c.top.isInstanceOf[Bar] == true) | ||||
| assert(c.top.isInstanceOf[Foo] == true) | ||||
|  | ||||
| // Variance check 2 | ||||
| val d: Stack[Foo] = EmptyStack().push(new Bar()).push(new Bar()) | ||||
| assert(d.top.isInstanceOf[Foo]) | ||||
		Reference in New Issue
	
	Block a user