Table of Contents

Lab 4. Data types in Scala

Objectives:

4.1 Natural Numbers

Given the following implementation of the natural numbers, solve the next few exercices.

trait NaturalNumber
case object Zero extends NaturalNumber
case class Successor(x: NaturalNumber) extends NaturalNumber

4.1.1 Write a function which takes two natural numbers, and return their sum.

def add(x: NaturalNumber, y: NaturalNumber): NaturalNumber = ???

4.1.2 Write a function which takes two natural numbers, and return their product.

def multiply(x: NaturalNumber, y: NaturalNumber): NaturalNumber = ???

4.1.3 Write a function which takes an int and converts it to a NaturalNumber.

def toNaturalNumber(x: Int): NaturalNumber = ???

4.2 Binary Trees

Given the following implementation of binary trees, solve the next few exercices.

trait BTree
case object EmptyTree extends BTree
case class Node(value: Int, left: BTree, right: BTree) extends BTree

4.2.1 Write a function which takes a BinaryTree and returns its depth.

def depth(tree: BTree): Int = ???

4.2.2 Write a function which takes a BinaryTree and returns the number of nodes with even number of children.

def evenChildCount(tree: BTree): Int = ???

4.2.3 Write a function which takes a BinaryTree and flattens it (turns it into a list containing the values of the nodes).

def flatten(tree: BTree): List[Int] = ???

4.2.4 Write a function which takes a BinaryTree and return the number of nodes whose values follow a ceratain rule.

def countNodes(tree: BTree, cond: Int => Boolean): Int = ???

4.2.5 Write a function which takes a BinaryTree and return mirrored BTree.

def mirror(tree: BTree): BTree= ???

4.3 Matrix manipulation

We shall represent matrices as lists of lists, i.e. values of type [ [Integer ] ]. Each element in the outer list represents a line of the matrix. Hence, the matrix

$ \displaystyle \left(\begin{array}{ccc} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{array}\right)$

will be represented by the list [ [1,2,3],[4,5,6],[7,8,9] ].

To make signatures more legible, add the type alias to your code:

 type Matrix = List[List[Int]] 

which makes the type-name Matrix stand for [ [Integer] ].

4.3.1 Write a function that computes the scalar product with an integer:

$ \displaystyle 2 * \left(\begin{array}{ccc} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{array}\right) = \left(\begin{array}{ccc} 2 & 4 & 6 \\ 8 & 10 & 12 \\ 14 & 16 & 18 \\ \end{array}\right)$

def vprod(m: Matrix)(v: Int): Matrix = ??? 

4.3.2 Write a function which adjoins two matrices by extending rows:

$ \displaystyle \left(\begin{array}{cc} 1 & 2 \\ 3 & 4\\\end{array}\right) hjoin \left(\begin{array}{cc} 5 & 6 \\ 7 & 8\\\end{array}\right) = \left(\begin{array}{cc} 1 & 2 & 5 & 6 \\ 3 & 4 & 7 & 8\\\end{array}\right) $

def join(m1: Matrix, m2: Matrix): Matrix = ???

4.3.3 Write a function which adjoins two matrices by adding new rows:

$ \displaystyle \left(\begin{array}{cc} 1 & 2 \\ 3 & 4\\\end{array}\right) vjoin \left(\begin{array}{cc} 5 & 6 \\ 7 & 8\\\end{array}\right) = \left(\begin{array}{cc} 1 & 2 \\ 3 & 4 \\ 5 & 6\\ 7 & 8\\ \end{array}\right) $

def vjoin(m1: Matrix, m2: Matrix): Matrix = ???

4.3.4 Write a function which adds two matrices.

def msum(m1: Matrix, m2: Matrix): Matrix = ???

4.3.5 Write a function which computes the transposition of a matrix:

$ tr \left(\begin{array}{ccc} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{array}\right) = \left(\begin{array}{ccc} 1 & 4 & 7 \\ 2 & 5 & 8 \\ 3 & 6 & 9 \\ \end{array}\right) $

def tr(m: Matrix): Matrix = ???

4.3.6 Write a function which computes the vectorial product of two matrices.

def mprod(m1: Matrix, m2: Matrix): Matrix = ???