FP Test3 2025
Jump to navigation
Jump to search
Home Preparation For Test 3 - 2025
(Theme: Vending Machine)
Data types and examples
Let's have a data types representing the state of a vending machine:
- a type
Stockfor the available ingredients (name and quantity), - a type
Drinkwith the drink’s name, price, and list of required ingredients, - a type Machine that combines both stock and available drinks.
type Stock = [(String, Int)]
data Drink = Drink { name :: String , price :: Int , ingredients :: [String] } deriving Show
data Machine = Machine {stock :: Stock, drinks :: [Drink] } deriving Show
stockExample :: Stock
stockExample = [ ("water", 10) , ("coffee", 4) , ("milk", 2) , ("tea", 3) , ("sugar", 5) , ("cocoa", 1) ]
drinksList :: [Drink]
drinksList = [
Drink "Coffee" 30 ["water","coffee"],
Drink "StrongCoffee" 40 ["water","coffee","coffee"],
Drink "Tea" 25 ["water", "water","tea"],
Drink "Cappuccino" 45 ["water","coffee","milk"],
Drink "Latte" 50 ["water","coffee","milk","sugar"],
Drink "Chocolate" 50 ["water","cocoa","milk"],
Drink "Cocoa" 60 ["milk","cocoa","milk"]
]
machineExample :: Machine
machineExample = Machine stockExample drinksList
Tasks
Create functions that:
- Implement a function
findDrinkthat finds a drink by name from a list.
If the drink does not exist, raise an error "No such drink".
findDrink :: [Drink] -> String -> Drink
ghci> findDrink drinksList "Tea"
Drink {name = "Tea", price = 25, ingredients = ["water","water","tea"]}
- Implement a function
inStockthat checks whether a given ingredient is currently available in stock.
inStock :: Stock -> String -> Bool
ghci> inStock stockExample "milk"
True
ghci> inStock stockExample "juice"
False
- Implement a function
useIngredientthat decreases the quantity of a given ingredient by one unit.
Ingredients with zero quantity should be removed from the stock.
useIngredient :: Stock -> String -> Stock
ghci> useIngredient stockExample "milk"
[("water",10),("coffee",4),("milk",1),("tea",3),("sugar",5),("cocoa",1)]
ghci> useIngredient stockExample "cocoa"
[("water",10),("coffee",4),("milk",2),("tea",3),("sugar",5)]
- Implement a function
canServeDrinkthat checks whether all ingredients required for a drink are available.
canServeDrink :: Stock -> Drink -> Bool
ghci> canServeDrink stockExample (findDrink drinksList "Cocoa")
True
- Implement a function
serveDrinkthat updates the stock after preparing a drink.
If some ingredient is missing, raise an error "Can not serve this drink".
serveDrink :: Stock -> Drink -> Stock
ghci> serveDrink stockExample (findDrink drinksList "Cocoa")
[("water",10),("coffee",4),("tea",3),("sugar",5)]
- Using the same coordinates as for the functions above, define a function
getPartthat takes a maze and extracts a rectangular part of this maze. The maze is given as first parameter. The extracted part is defined by the position of the top left corner (second parameter) and its size (third parameter, given as (height, width)).
getPart :: Maze -> (Int,Int) -> (Int,Int) -> Maze
ghci> printMaze(getPart sample1 (1,1) (7,7))
* *
* * *
* * *
*
******
*******
- Implement the function
solveMaze. It has 1 argument. It is a list of strings representing a maze row by row from top to bottom ('*' - wall, ' ' - empty square, 's' - starting position, 'e' - ending possition). At the beginning we are at position 's' and we want to get the length of the shortest path to the position denotated by 'e'. Such path compose from steps. in each step we can move one square left, right, up or down. The function returns a number of these steps in the shortest path from 's' to 'e'.
solveMaze :: Result -> Int
solveMaze sample4
12