Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
fp2023:lab04 [2023/03/21 07:23]
pdmatei
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 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: Consider the following type defined to represent lists of integers:
Line 63: Line 8:
 </​code>​ </​code>​
  
-**4.2.1.** Implement ''​isEmpty''​ which checks if a list is empty:+**4.1.** Implement ''​isEmpty''​ which checks if a list is empty:
 <code scala> <code scala>
 def isEmpty(l: IList): Boolean = ??? def isEmpty(l: IList): Boolean = ???
 </​code>​ </​code>​
  
-**4.2.2.** Implement ''​size''​ which returns the size of the list:+**4.2.** Implement ''​size''​ which returns the size of the list:
 <code scala> <code scala>
 def size(l: IList): Int = ??? def size(l: IList): Int = ???
 </​code>​ </​code>​
  
-**4.2.3.** Implement ''​append''​ which concatenates two lists:+**4.3.** Implement ''​append''​ which concatenates two lists:
 <code scala> <code scala>
 def append(l1: IList, l2: IList): IList = ??? def append(l1: IList, l2: IList): IList = ???
 </​code>​ </​code>​
  
-**4.2.4.** (!) Implement ''​last''​ which returns the last element from a list:+**4.4.** (!) Implement ''​last''​ which returns the last element from a list:
 <code scala> <code scala>
 def last(l: IList): Int = ??? def last(l: IList): Int = ???
 </​code>​ </​code>​
  
-**4.2.5.** (!) Implement ''​reverse''​. There are two different ways to implement reverse (with direct and with tail-end recursion). Try both implementations.+**4.5.** (!) Implement ''​reverse''​. There are two different ways to implement reverse (with direct and with tail-end recursion). Try both implementations.
 <code scala> <code scala>
 def reverse(l: IList): IList = ??? def reverse(l: IList): IList = ???
 </​code>​ </​code>​
  
-**4.2.6.** Implement ''​contains''​ which checks if an element is a member of a list.+**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> <code scala>
-def contains(e: Intl: IList): IList = ???+def take(n: Int)(l: IList): IList = ???
 </​code>​ </​code>​
  
-**4.2.7.** Implement ''​max''​ which returns ​the largest integer from a list:+**4.9.** Implement ''​drop''​ which returns a new list containing the original list without the first ''​n''​ elements:
 <code scala> <code scala>
-def max(l: Ilist): IList = ???+def drop(n: Int)(l: IList): IList = ???
 </​code>​ </​code>​
  
-**4.2.8.** Implement ''​isSorted''​ which checks if a list is sorted:+**4.10.** Implement ''​isSorted''​ which checks if a list is sorted:
 <code scala> <code scala>
-def isSorted(l: IList): ​IList = ???+def isSorted(l: IList): ​Boolean ​= ???
 </​code>​ </​code>​
  
-**4.2.9.** Implement ''​merge''​ which merges two sorted lists:+**4.11.** Implement ''​merge''​ which merges two sorted lists:
 <code scala> <code scala>
 def merge(l1: IList, l2: IList): IList = ??? def merge(l1: IList, l2: IList): IList = ???
 </​code>​ </​code>​
  
-**4.2.10.** Implement ''​mergeSort''​ which sorts a list:+**4.12.** Implement ''​mergeSort''​ which sorts a list:
 <code scala> <code scala>
 def mergesort(l:​ IList) IList = ??? def mergesort(l:​ IList) IList = ???
 </​code>​ </​code>​