Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
fp2023:lab04 [2023/03/21 07:06]
pdmatei created
fp2023:lab04 [2023/03/24 14:53] (current)
pdmatei
Line 1: Line 1:
 ====== Lab 4. Algebraic Datatype definition ====== ====== Lab 4. Algebraic Datatype definition ======
  
-==== 4.1. The type Nat =====  +Consider the following type defined to represent ​lists of integers:
-Consider the following type defined to represent ​natural numbers:+
 <code scala> <code scala>
-trait Nat  +trait IList  
-case object ​Zero extends ​Nat +case object ​Void extends ​IList 
-case class Succ(nNat) extends ​Nat+case class Cons(xInt, xs: IList) extends ​IList
 </​code>​ </​code>​
  
-4.1.1. Implement ​the following function:+**4.1.** Implement ​''​isEmpty''​ which checks if a list is empty:
 <code scala> <code scala>
-def isZero(nNat): Nat  +def isEmpty(lIList): Boolean ​= ???
-   n match { +
-       case Zero => ??? +
-       case Succ(np) => ??? +
-   }+
 </​code>​ </​code>​
  
-4.1.2. Implement the addition function over natural numbers:+**4.2.** Implement ​''​size''​ which returns the size of the list:
 <code scala> <code scala>
-def add(nNat, m: Nat): Nat =  +def size(lIList): Int = ???
-   n match { +
-       case Zero => ??? +
-       case Succ(np) ​=??? +
-   }+
 </​code>​ </​code>​
  
-4.1.3. Implement ​the subtraction function over natural numbers. If $math[n > m] then $math[m - n = 0].+**4.3.** Implement ​''​append''​ which concatenates two lists:
 <code scala> <code scala>
-def subtract(nNatmNat): Nat = ???+def append(l1IListl2IList): IList = ???
 </​code>​ </​code>​
  
 +**4.4.** (!) Implement ''​last''​ which returns the last element from a list:
 +<code scala>
 +def last(l: IList): Int = ???
 +</​code>​
  
 +**4.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.6.** Implement ''​contains''​ which checks if an element is a member of a list.
 +<code scala>
 +def contains(e: Int, l: IList): Boolean = ???
 +</​code>​
 +
 +**4.7.** Implement ''​max''​ which returns the largest integer from a list:
 +<code scala>
 +def max(l: IList): Int = ???
 +</​code>​
 +
 +**4.8.** Implement ''​take''​ which returns a new list containing the first ''​n''​ elements of the original list:
 +<code scala>
 +def take(n: Int)(l: IList): IList = ???
 +</​code>​
 +
 +**4.9.** Implement ''​drop''​ which returns a new list containing the original list without the first ''​n''​ elements:
 +<code scala>
 +def drop(n: Int)(l: IList): IList = ???
 +</​code>​
 +
 +**4.10.** Implement ''​isSorted''​ which checks if a list is sorted:
 +<code scala>
 +def isSorted(l: IList): Boolean = ???
 +</​code>​
 +
 +**4.11.** Implement ''​merge''​ which merges two sorted lists:
 +<code scala>
 +def merge(l1: IList, l2: IList): IList = ???
 +</​code>​
 +
 +**4.12.** Implement ''​mergeSort''​ which sorts a list:
 +<code scala>
 +def mergesort(l:​ IList) IList = ???
 +</​code>​