Tip of the day

News

## Instructions

**Objective**

Write a program in Haskell to create and implement functions for manipulating trees.

## Requirements and Specifications

Applying Functions to Trees Background Material

There are many possible variants of the type of binary trees introduced in the Lecture Notes.

Notice how now, the tree stores two different types of data: an element of type `a` at each fork and an element of type

`b` at each leaf.

Implementation Task

Your task is to write a haskell assignment higher-order function `applyfuns` that takes two functions `f :: a -> c` and `g :: b -> d`, as well as an element of type `Tree a b` as input and applies the first function to the values found at the forks, and the second function to the values found at the leaves. That is, implement the function:

```haskell

applyfuns :: (a -> c) -> (b -> d) -> Tree a b -> Tree c d

applyfuns = undefined

```

**Screenshots of output**

**Source Code**

`-- setting the "warn-incomplete-patterns" flag asks GHC to warn you-- about possible missing cases in pattern-matching definitions{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}-- see https://wiki.haskell.org/Safe_Haskell{-# LANGUAGE Safe #-}module Assessed2 (applyfuns , updateNodes , graft , elimImplications , isInCNF , toCNF , binToRose , roseToBin) whereimport Types------------------------------------------------------------------------------------------------- DO **NOT** MAKE ANY CHANGES ABOVE THIS LINE ----------------------------------------------------------------------------------------------------- {- Exercise 1 -}applyfuns :: (a -> c) -> (b -> d) -> Tree a b -> Tree c dapplyfuns _ fleaf (Leaf x) = Leaf (fleaf x) -- if leaf, apply second functionapplyfuns ffork fleaf (Fork lt x rt) = -- if fork, apply first function and recurse Fork (applyfuns ffork fleaf lt) (ffork x) (applyfuns ffork fleaf rt){- Exercise 2 -}updateNodes :: Route -> (a -> a) -> BinTree a -> BinTree aupdateNodes _ _ Empty = Empty -- if leaf, endupdateNodes [] f (Node lt x rt) = Node lt (f x) rt -- if empty route, apply to root and end-- if left, apply to this node and recurse leftupdateNodes (GoLeft:ts) f (Node lt x rt) = Node (updateNodes ts f lt) (f x) rt-- if right, apply to this node and recurse rightupdateNodes (GoRight:ts) f (Node lt x rt) = Node lt (f x) (updateNodes ts f rt){- Exercise 3 -}graft :: Rose -> [ Rose ] -> (Rose , [ Rose ])-- if leaf, append head of list, return grafted tree and tailgraft (Br []) (br:tl) = (br, tl)graft (Br brlst) ls = let (nbrs, nlst) = graftList brlst ls in -- graft nodes in list (Br nbrs, nlst) -- return new tree with the grafted nodes and the resulting list where -- graft a list of nodes graftList [] gs = ([], gs) -- if we reached the end of list, return empty list and remaining graftList (hb:tb) gs = -- if the list has more elements let (rb, lb) = graft hb gs in -- process head, save the result let (rs, rl) = graftList tb lb in -- recurse to process rest of list, save result (rb:rs, rl) -- combine head result with tail list result, return it with the remaining list{- Exercise 4 -}elimImplications :: Expr -> ExprelimImplications (Not p) = Not (elimImplications p)elimImplications (Conj p q) = Conj (elimImplications p) (elimImplications q)elimImplications (Disj p q) = Disj (elimImplications p) (elimImplications q)-- replace p-> q by ~p v qelimImplications (Implies p q) = Disj (Not (elimImplications p)) (elimImplications q)elimImplications (Var s) = Var sisInCNF :: Expr -> BoolisInCNF expr | isClause expr = True -- is cnf if it's a clause | otherwise = case expr of (Conj p q) -> isInCNF p && isInCNF q -- it's cnf if it's a conjunction of cnf's _ -> False -- else, it's not a cnf where isClause (Var _) = True -- literal is a clause isClause (Not (Var _)) = True -- negation of literal is a clause isClause (Disj p q) = isClause p && isClause q -- Clause v Clause is a clause isClause _ = False -- anything else is not a clausetoCNF :: Expr -> ExprtoCNF e = simpDistrib (simpNegations (simpDeMorgan (simpNegations (elimImplications e)))) where simpNegations (Not (Not p)) = p simpNegations (Conj p q) = Conj (simpNegations p) (simpNegations q) simpNegations (Disj p q) = Disj (simpNegations p) (simpNegations q) simpNegations x = x -- vars are not simplified simpDeMorgan (Not (Disj p q)) = Conj (Not (simpDeMorgan p)) (Not (simpDeMorgan q)) simpDeMorgan (Not (Conj p q)) = Disj (Not (simpDeMorgan p)) (Not (simpDeMorgan q)) simpDeMorgan (Not p) = Not (simpDeMorgan p) simpDeMorgan (Disj p q) = Disj (simpDeMorgan p) (simpDeMorgan q) simpDeMorgan (Conj p q) = Conj (simpDeMorgan p) (simpDeMorgan q) simpDeMorgan x = x simpDistrib (Disj p (Conj q r)) = let simpp = simpDistrib p in Conj (Disj simpp (simpDistrib q)) (Disj simpp (simpDistrib r)) simpDistrib (Disj (Conj p q) r) = let simpr = simpDistrib r in Conj (Disj (simpDistrib p) simpr) (Disj (simpDistrib q) simpr) simpDistrib (Not p) = Not (simpDistrib p) simpDistrib (Disj p q) = Disj (simpDistrib p) (simpDistrib q) simpDistrib (Conj p q) = Conj (simpDistrib p) (simpDistrib q) simpDistrib x = x{- Exercise 5 -}binToRose :: Bin -> RosebinToRose Root = Br [] -- leaf is an empty rose-- use helper to fill rose tree if root doesn't have leftbinToRose (Branch Root r) = Br (binToRosePar r []) where -- par is the current parent list of nodes binToRosePar Root par = par -- if we reached a leaf, return the list of parent nodes binToRosePar (Branch l r) par = let narch = binToRosePar r [] in -- convert right child let parch = binToRosePar l par in -- convert left child -- add current node using converted right child as its list of nodes, -- to the parent nodes after left child has been added (Br narch):parch-- else, convert directly to binary rosebinToRose (Branch l r) = binToRoseB (Branch l r) where binToRoseB Root = Br [] binToRoseB (Branch l r) = Br [binToRoseB l, binToRoseB r]roseToBin :: Rose -> BinroseToBin root | isBin root = roseToBinB root -- if is a binart, convert directly | otherwise = roseToBinSib [root] -- process as a node without siblings where roseToBinSib [] = Root -- if no more siblings, is a leaf -- if there is a node, create branch, add siblings to the left and -- children of this node to the right roseToBinSib ((Br chs):ss) = Branch (roseToBinSib ss) (roseToBinSib chs) roseToBinB (Br []) = Root roseToBinB (Br [l,r]) = Branch (roseToBinB l) (roseToBinB r) roseToBinB _ = Root isBin (Br []) = True isBin (Br [_]) = False isBin (Br (l:r:[])) = isBin l && isBin r isBin (Br _) = False`

## Related Samples

Discover our Haskell Assignment Samples for precise solutions to functional programming challenges. Covering monads, recursion, and type inference, these examples provide clear explanations and practical implementations. Perfect for students aiming to deepen their Haskell skills and excel academically with structured, educational content tailored to programming assignments.

Haskell

Word Count

4362 Words

Writer Name:Dr. Liam Patel

Total Orders:600

Satisfaction rate:

Haskell

Word Count

6608 Words

Writer Name:John Williams

Total Orders:900

Satisfaction rate:

Haskell

Word Count

5340 Words

Writer Name:Dr. Samantha Taylor

Total Orders:715

Satisfaction rate:

Haskell

Word Count

6469 Words

Writer Name:Dr. Samantha Taylor

Total Orders:715

Satisfaction rate:

Haskell

Word Count

4143 Words

Writer Name:Prof. Liam Reynolds

Total Orders:685

Satisfaction rate:

Haskell

Word Count

4466 Words

Writer Name:Nadia Dubois

Total Orders:682

Satisfaction rate:

Haskell

Word Count

6071 Words

Writer Name:Dr. Samantha Bennett

Total Orders:812

Satisfaction rate:

Haskell

Word Count

4841 Words

Writer Name:Dr. Chloe Wong

Total Orders:941

Satisfaction rate:

Haskell

Word Count

4266 Words

Writer Name:David Lee

Total Orders:764

Satisfaction rate:

Haskell

Word Count

12138 Words

Writer Name:Professor Anderson

Total Orders:700

Satisfaction rate:

Haskell

Word Count

3767 Words

Writer Name:Professor Marcus Johnson

Total Orders:600

Satisfaction rate:

Haskell

Word Count

5726 Words

Writer Name:Nadia Dubois

Total Orders:682

Satisfaction rate:

Haskell

Word Count

11881 Words

Writer Name:Professor Marcus Johnson

Total Orders:600

Satisfaction rate:

Haskell

Word Count

3752 Words

Writer Name:Dr. Chen Wang

Total Orders:521

Satisfaction rate:

Haskell

Word Count

5102 Words

Writer Name:Dr. Benjamin

Total Orders:812

Satisfaction rate:

Haskell

Word Count

7728 Words

Writer Name:Liam Chen

Total Orders:750

Satisfaction rate:

Haskell

Word Count

5512 Words

Writer Name:Dr. Chloe Wong

Total Orders:941

Satisfaction rate:

Haskell

Word Count

987 Words

Writer Name:David Lee

Total Orders:764

Satisfaction rate:

Haskell

Word Count

4978 Words

Writer Name:Professor Marcus Johnson

Total Orders:600

Satisfaction rate:

Haskell

Word Count

4716 Words

Writer Name:Professor Marcus Johnson

Total Orders:600

Satisfaction rate: