Difference between revisions of "FP Laboratory 3/en"

From Marek Běhálek Wiki
Jump to navigation Jump to search
(Updating to match new version of source page)
 
(Updating to match new version of source page)
 
(One intermediate revision by the same user not shown)
Line 213: Line 213:
 
<div style="clear:both"></div>
 
<div style="clear:both"></div>
  
* Create a function that product scalar multiplication if two vectors.
+
* Create a function that product scalar multiplication of two vectors.
  
 
<syntaxhighlight lang="Haskell">scalar :: [Int] -> [Int] -> Int</syntaxhighlight>
 
<syntaxhighlight lang="Haskell">scalar :: [Int] -> [Int] -> Int</syntaxhighlight>
Line 230: Line 230:
 
</div>
 
</div>
 
<div style="clear:both"></div>
 
<div style="clear:both"></div>
 +
 +
= Additional exercises =
 +
* Create a function that eliminates all occurrences of zeros in a list.
 +
 +
<syntaxhighlight lang="Haskell">nonZeros :: [Int] -> [Int]</syntaxhighlight>
 +
<syntaxhighlight lang="Haskell" class="myDark">
 +
*Main> nonZeros [0,1,0,2,3,0,0]
 +
[1,2,3]
 +
</syntaxhighlight>
 +
 +
* Create a function that realizes the left rotation of a list by one element.
 +
 +
<syntaxhighlight lang="Haskell">rotateLeft1 :: [a] -> [a]</syntaxhighlight>
 +
<syntaxhighlight lang="Haskell" class="myDark">
 +
*Main> rotateLeft1 [1,2,3,4,5]
 +
[2,3,4,5,1]
 +
</syntaxhighlight>
 +
 +
* Create a function that realizes the right rotation of a list by one element.
 +
 +
<syntaxhighlight lang="Haskell">rotateRight1 :: [a] -> [a]</syntaxhighlight>
 +
<syntaxhighlight lang="Haskell" class="myDark">
 +
*Main> rotateRight1 [1,2,3,4,5]
 +
[5,1,2,3,4]
 +
</syntaxhighlight>
 +
 +
* Create a function that eliminates all even numbers from a list.
 +
 +
<syntaxhighlight lang="Haskell">oddMembers :: [Int] -> [Int]</syntaxhighlight>
 +
<syntaxhighlight lang="Haskell" class="myDark">
 +
*Main> oddMembers [0,1,0,2,3,0,0]
 +
[1,3]
 +
</syntaxhighlight>
 +
 +
* Create a function that counts all odd numbers in a given list (define non-recursively using previously defined functions).
 +
 +
<syntaxhighlight lang="Haskell">countOddMembers :: [Int] -> Int</syntaxhighlight>
 +
<syntaxhighlight lang="Haskell" class="myDark">
 +
*Main> countOddMembers [1,0,3,1,4,5]
 +
4
 +
</syntaxhighlight>
 +
 +
* Create a function that compares lists of numbers if they are equal.
 +
 +
<syntaxhighlight lang="Haskell">compareLists :: Eq a => [a] -> [a] -> Bool </syntaxhighlight>
 +
<syntaxhighlight lang="Haskell" class="myDark">
 +
*Main> compareLists [5,8,11] [5,8,11]
 +
True
 +
*Main> compareLists [5,8,11] [3,5,8]
 +
False
 +
*Main> compareLists [] []
 +
True
 +
*Main> compareLists [5,8,11] [5,8,11,13]
 +
False
 +
</syntaxhighlight>

Latest revision as of 06:18, 10 October 2023

Usage of lists

Find out the results of the following operations:

[3,2,1] > [2,1,0]  
[3,2,1] > [2,10,100]  
[3,4,2] > [3,4]  
[3,4,2] > [2,4]  
[3,4,2] == [3,4,2]

Simple functions working with list

Implement following functions:

  • Create a function that computes length of a list.
length' :: [a] -> Int
*Main> length' "ABCD"
4
length' :: [a] -> Int
length' []  = 0
length' (_:xs) = 1 + length' xs
Try it!
  • Create a function that sums the list of integers.
Video logo.png
sumIt :: [Int] -> Int
*Main> sumIt [1,2,3]
6
sumIt :: [Int] -> Int
sumIt []  = 0
sumIt (x:xs) = x + sumIt xs
Try it!
  • Create a function that returns the first element in the list.
getHead :: [a] -> a
*Main> getHead [1,2,3]
1
getHead :: [a] -> a
getHead (x:_) = x
Try it!
  • Create a function that returns the last element in the list.
Video logo.png
getLast :: [a] -> a
*Main> getLast [1,2,3]
3
getLast :: [a] -> a
getLast [x] = x
getLast (x:xs) = getLast xs

getLast' :: [a] -> a
getLast' (x:xs) | length xs == 0 = x
                | otherwise = getLast' xs
Try it!
  • Create a function that checks if an element is a member of the list.
isElement :: Eq a => a -> [a] -> Bool
*Main> isElement 2 [1,2,3]
True
isElement :: Eq a => a -> [a] -> Bool
isElement _ [] = False
isElement a (x:xs) | a == x = True 
                   | otherwise = isElement a xs
Try it!
  • Create a function that returns the list without the first element.
getTail :: [a] -> [a]
*Main> getTail [1,2,3]
[2,3]
getTail :: [a] -> [a]                   
getTail (_:xs) = xs
Try it!
  • Create a function that returns the list without the last element.
Video logo.png
getInit :: [a] -> [a]
*Main> getInit [1,2,3]
[1,2]
getInit :: [a] -> [a]
getInit [_] = []
getInit (x:xs) = x : getInit xs
Try it!
  • Create a function that merge two lists into one list.
Video logo.png
combine :: [a] -> [a] -> [a]
*Main> combine [1,2,3] [4,5]
[1,2,3,4,5]
combine :: [a] -> [a] -> [a]
combine [] y = y
combine (x:xs) y = x : combine xs y
Try it!
  • Create a function that finds the maximum in the list of integers.
Video logo.png
max' :: [Int] -> Int
*Main> max' [3,1,7,5]
7
max' :: [Int] -> Int
max' [x] = x
max' (x:y:z) | x > y = max' (x:z)
             | otherwise = max' (y:z)

max'' :: [Int] -> Int
max'' (y:ys) = tmp y ys where
   tmp a [] = a
   tmp a (x:xs) | x > a = tmp x xs 
                |otherwise = tmp a xs
Try it!
  • Create a function that reverse a list.
Video logo.png
reverse' :: [a] -> [a]
*Main> reverse' [3,1,7,5]
[5,7,1,3]
reverse' :: [a] -> [a]             
reverse' [] = []
reverse' (x:xs) = (reverse' xs) ++ [x]

reverse'' :: [a] -> [a] 
reverse'' n = tmp n  []
  where tmp [] ys = ys 
        tmp (x:xs) ys = tmp xs (x:ys)
Try it!
  • Create a function that product scalar multiplication of two vectors.
scalar :: [Int] -> [Int] -> Int
*Main> scalar [1,2,3] [4,5,6]
32
scalar :: [Int] -> [Int] -> Int
scalar [] [] = 0
scalar (x:xs) (y:ys) = x*y + scalar xs ys
Try it!

Additional exercises

  • Create a function that eliminates all occurrences of zeros in a list.
nonZeros :: [Int] -> [Int]
*Main> nonZeros [0,1,0,2,3,0,0]
[1,2,3]
  • Create a function that realizes the left rotation of a list by one element.
rotateLeft1 :: [a] -> [a]
*Main> rotateLeft1 [1,2,3,4,5]
[2,3,4,5,1]
  • Create a function that realizes the right rotation of a list by one element.
rotateRight1 :: [a] -> [a]
*Main> rotateRight1 [1,2,3,4,5]
[5,1,2,3,4]
  • Create a function that eliminates all even numbers from a list.
oddMembers :: [Int] -> [Int]
*Main> oddMembers [0,1,0,2,3,0,0] 
[1,3]
  • Create a function that counts all odd numbers in a given list (define non-recursively using previously defined functions).
countOddMembers :: [Int] -> Int
*Main> countOddMembers [1,0,3,1,4,5]
4
  • Create a function that compares lists of numbers if they are equal.
compareLists :: Eq a => [a] -> [a] -> Bool
*Main> compareLists [5,8,11] [5,8,11]
True
*Main> compareLists [5,8,11] [3,5,8]
False
*Main> compareLists [] []
True
*Main> compareLists [5,8,11] [5,8,11,13]
False