Edit this page Backlinks This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ====== Lab 4. Algebraic Datatype definition ====== ==== 4.1. The type Nat ===== Consider the following type defined to represent natural numbers: <code scala> trait Nat case object Zero extends Nat case class Succ(n: Nat) extends Nat </code> 4.1.1. Implement the following function: <code scala> def isZero(n: Nat): Nat = n match { case Zero => ??? case Succ(np) => ??? } </code> 4.1.2. Implement the addition function over natural numbers: <code scala> def add(n: Nat, m: Nat): Nat = n match { case Zero => ??? case Succ(np) => ??? } </code> 4.1.3. Implement the subtraction function over natural numbers. If $math[n > m] then $math[m - n = 0]. <code scala> def subtract(n: Nat, m: Nat): Nat = ??? </code> 4.1.4. Implement ''greater'' which checks if a natural number is strictly larger than the other: <code scala> def greater(n: Nat, m: Nat): Nat = (n,m) match { ??? } </code> 4.1.5. Equality is already defined for all case classes, as structural equality (objects built in the same way are equal). However, re-implement equality over naturals: <code scala> def equal(n: Nat, m: Nat): Nat = ??? </code> 4.1.6. Implement a function which converts a Nat to a Scala Int: <code scala> def toInt(n: Nat): Int = ??? </code> 4.1.7. Implement a function which converts an Int to a Nat: <code scala> def fromInt(i: Int): Nat = ??? </code> ===== 4.2. The type IList (list over integers) ===== Consider the following type defined to represent lists of integers: <code scala> trait IList case object Void extends IList case class Cons(x: Int, xs: IList) extends IList </code> 4.2.1. Implement ''isEmpty'' which checks if a list is empty: <code scala> def isEmpty(l: IList): Boolean = ??? </code> 4.2.2. Implement ''size'' which returns the size of the list: <code scala> def size(l: IList): Int = ??? </code> 4.2.3. Implement ''append'' which concatenates two lists: <code scala> def append(l1: IList, l2: IList): IList = ??? </code> 4.2.4. (!) Implement ''last'' which returns the last element from a list: <code scala> def last(l: IList): Int = ??? </code> 4.2.5. (!) Implement ''reverse''. There are two different ways to implement reverse (with direct and with tail-end recursion). Try both implementations. <code scala> def reverse(l: IList): IList = ??? </code> 4.2.6. Implement ''contains'' which checks if an element is a member of a list. <code scala> def contains(e: Int, l: IList): IList = ??? </code> 4.2.7. Implement ''max'' which returns the largest integer from a list: <code scala> def max(l: Ilist): IList = ??? </code> 4.2.8. Implement ''isSorted'' which checks if a list is sorted: <code scala> def isSorted(l: IList): IList = ??? </code> 4.2.9. Implement ''merge'' which merges two sorted lists: <code scala> def merge(l1: IList, l2: IList): IList = ??? </code> 4.2.10. Implement ''mergeSort'' which sorts a list: <code scala> def mergesort(l: IList) IList = ??? </code>