Difference between revisions of "FP Laboratory 11"

From Marek Běhálek Wiki
Jump to navigation Jump to search
Line 101: Line 101:
 
<translate>
 
<translate>
 
== Additional exercises ==
 
== Additional exercises ==
 +
* Implement a function that counts all leaves in the tree.
 +
</translate>
 +
<syntaxhighlight lang="Haskell">
 +
leafCount :: Tree a -> Int
 +
</syntaxhighlight>
 +
 +
<translate>
 +
* Implement a function that counts all branches in the tree.
 +
</translate>
 +
<syntaxhighlight lang="Haskell">
 +
branchCount :: Tree a -> Int
 +
</syntaxhighlight>
 +
 +
<translate>
 
* Implement a function that checks whether a given element is stored in the tree.  
 
* Implement a function that checks whether a given element is stored in the tree.  
 +
</translate>
 
<syntaxhighlight lang="Haskell">
 
<syntaxhighlight lang="Haskell">
 
contains :: Eq a => Tree a -> a -> Bool
 
contains :: Eq a => Tree a -> a -> Bool
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
<translate>
 
* Implement a function that finds a maximum value stored in the tree.
 
* Implement a function that finds a maximum value stored in the tree.
 +
</translate>
 
<syntaxhighlight lang="Haskell">
 
<syntaxhighlight lang="Haskell">
 
maxTree :: Ord a => Tree a -> a
 
maxTree :: Ord a => Tree a -> a
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
<translate>
 
* Implement a function that returns a number of elements greater than a given value.
 
* Implement a function that returns a number of elements greater than a given value.
 +
</translate>
 
<syntaxhighlight lang="Haskell">
 
<syntaxhighlight lang="Haskell">
 
greaterThan :: Ord a => Tree a -> a -> Int
 
greaterThan :: Ord a => Tree a -> a -> Int
 
</syntaxhighlight>
 
</syntaxhighlight>
+
 
 +
<translate>
 
* Implement a function that returns the depth of a tree.
 
* Implement a function that returns the depth of a tree.
 +
</translate>
 
<syntaxhighlight lang="Haskell">
 
<syntaxhighlight lang="Haskell">
 
depthTree :: Tree a -> Int
 
depthTree :: Tree a -> Int
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
<translate>
 
* Consider the following alternative definition of the binary tree.
 
* Consider the following alternative definition of the binary tree.
 
</translate>
 
</translate>
Line 127: Line 149:
 
data Tree2 a = Null | Branch a (Tree2 a) (Tree2 a)
 
data Tree2 a = Null | Branch a (Tree2 a) (Tree2 a)
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
<translate>
 
Is this definition equivalent to the previous one? If not, explain why and give an example of a tree that can be constructed with one definition but not with the second one.
 
Is this definition equivalent to the previous one? If not, explain why and give an example of a tree that can be constructed with one definition but not with the second one.
 +
</translate>

Revision as of 10:15, 7 August 2023

Binary Trees

  • Create a data type Tree that defines binary tree where values are stored in leaves and also in branches.
data Tree a = Leaf a 
            | Branch a (Tree a) (Tree a) deriving (Show)
  • Prepare an example of a binary tree.
testTree1 :: Tree Int            
testTree1 = Branch 12 (Branch 23 (Leaf 34) (Leaf 45)) (Leaf 55)

testTree2 :: Tree Char            
testTree2 = Branch 'a' (Branch 'b' (Leaf 'c') (Leaf 'd')) (Leaf 'e')
  • Create a function that sums all values stored in the tree.
sum' :: Tree Int -> Int
sum' :: Tree Int -> Int
sum' (Leaf x) = x
sum' (Branch x l r) = sum' l + x + sum' r
  • Create a function that extracts all values from the tree into an list.
toList :: Tree a -> [a]
toList :: Tree a -> [a]
toList (Leaf x) = [x]
toList (Branch x l r) = toList l ++ [x] ++ toList r
  • One possibility how to represent a tree in a textual form is a(b(d,e),c(e,f(g,h))). Create functions that are able to read and store a tree in such a notation.
Video logo.png
toString :: Show a => Tree a -> String
fromString :: Read a => String -> Tree a
toString :: Show a => Tree a -> String
toString (Leaf x) = show x
toString (Branch x l r) = show x ++ "(" ++ (toString l) ++ "," ++ (toString r) ++ ")"

fromString :: Read a => String -> Tree a
fromString inp = fst (fromString' inp) where
  fromString' :: Read a => String -> (Tree a,String)
  fromString' inp = 
    let
      before = takeWhile (\x ->  x /='(' &&  x /=',' &&  x/=')') inp 
      after = dropWhile (\x ->  x /='(' &&  x /=',' && x/=')') inp
      value = read before
    in if null after || head after /= '(' then (Leaf value, after) else 
        let
          (l,after') = fromString' (tail after)
          (r,after'') = fromString' (tail after') 
        in (Branch value l r, tail after'')


Additional exercises

  • Implement a function that counts all leaves in the tree.
leafCount :: Tree a -> Int
  • Implement a function that counts all branches in the tree.
branchCount :: Tree a -> Int
  • Implement a function that checks whether a given element is stored in the tree.
contains :: Eq a => Tree a -> a -> Bool
  • Implement a function that finds a maximum value stored in the tree.
maxTree :: Ord a => Tree a -> a
  • Implement a function that returns a number of elements greater than a given value.
greaterThan :: Ord a => Tree a -> a -> Int
  • Implement a function that returns the depth of a tree.
depthTree :: Tree a -> Int
  • Consider the following alternative definition of the binary tree.
data Tree2 a = Null | Branch a (Tree2 a) (Tree2 a)

Is this definition equivalent to the previous one? If not, explain why and give an example of a tree that can be constructed with one definition but not with the second one.