diff --git a/Assets/Solutions/Mid-Term/Mid-Term.md b/Assets/Solutions/Mid-Term/Mid-Term.md new file mode 100644 index 0000000..6413d41 --- /dev/null +++ b/Assets/Solutions/Mid-Term/Mid-Term.md @@ -0,0 +1,161 @@ +# 20CYS312 - Principles of Programming Languages +![](https://img.shields.io/badge/Batch-21CYS-lightgreen) ![](https://img.shields.io/badge/UG-blue) ![](https://img.shields.io/badge/Subject-PPL-blue)
+![](https://img.shields.io/badge/Lecture-2-orange) ![](https://img.shields.io/badge/Practical-3-orange) ![](https://img.shields.io/badge/Credits-3-orange) + +## Mid-Term Question Paper with Solutions + +#### 1. Write the \textit{type signature} of the below functions. +(a) **zip :: [a] → [b] → [(a, b)]**
+(b) **filter :: (a → Bool) → [a] → [a]** + +#### 2. Identify the type of the following values. + (a) "C" - **String or [Char]**
+ (b) (85, 'Y', [True]) - **(Int, Char, [Bool])**
+ (c) ["S":[]] - **[[String]] or [[[Char]]]** + +#### 3. Write a function '_pairswap_' that swaps the elements of a list on a pair-wise basis. +Assumption: the list has an even number of elements. +Usage Example: + 1. \> _pairswap_ [1..6] + [2,1,4,3,6,5] + 2. \> _pairswap_ "ammu" + "maum" + 3. \> _pairswap_ [] + [] + +**Solution:** +``` +pairswap:: [a] -> [a] +pairswap [ ] = [ ] +pairswap (x:y:xs) = y:x:pairswap(xs) +``` + +#### 5. Write the expression equivalent to the following list comprehension using map and/or filter. +(a) [ reverse s | s ← strs, even (length s) ]
+(b) [ length word | word ← words, length word > 5 ]
+(c) [ (x, y) | x ← [1..5], y ← [1..5], x + y == 6 ]
+(d) [ x^2 | x ← [1..10], even x ]
+ +**Solution:**
+(a)
+(b)
+(c)
+(d)
+ +#### 6. Write a Haskell code to generate the below HTML file with custom _body_ and _footer_ as mentioned. + - body = "Mid-Term Examination" + - footer = "19-March-2024" +``` + + + + + Haskell Generated HTML + + + +
+

Content generated by Haskell:

+
+ /* body content as mentioned above */ +
+
+ + + + +``` + +**Solution:** +``` + +``` + +#### 7. Implement a Queue with the isEmpty, enqueue, dequeue and front function using Haskell data type with Maybe. + +**Solution:** +``` +data Queue a = Queue { elements :: [a] } + +-- Check if the queue is empty +isEmpty :: Queue a -> Bool +isEmpty (Queue []) = True +isEmpty _ = False + +-- Enqueue an element into the queue +enqueue :: a -> Queue a -> Queue a +enqueue x (Queue xs) = Queue (xs ++ [x]) + +-- Dequeue an element from the queue +dequeue :: Queue a -> Maybe (a, Queue a) +dequeue (Queue []) = Nothing +dequeue (Queue (x:xs)) = Just (x, Queue xs) + +-- Dequeue an element from the queue +-- dequeue :: Queue a -> Maybe (Queue a) +-- dequeue (Queue []) = Nothing +-- dequeue (Queue (_:xs)) = Just (Queue xs) + + +-- Get the front element of the queue +front :: Queue a -> Maybe a +front (Queue []) = Nothing +front (Queue (x:_)) = Just x + +main :: IO () +main = do + let emptyQueue = Queue ([] :: [Int]) + let queue1 = enqueue 1 emptyQueue + let queue2 = enqueue 2 queue1 + + putStrLn "Testing Queue Implementation:" + putStrLn "Initial queue:" + putStrLn $ "Is empty? " ++ show (isEmpty emptyQueue) + putStrLn $ "Front element: " ++ show (front emptyQueue) + putStrLn "" + + putStrLn "After enqueueing 1:" + putStrLn $ "Is empty? " ++ show (isEmpty queue1) + putStrLn $ "Front element: " ++ show (front queue1) + putStrLn "" + + putStrLn "After enqueueing 2:" + putStrLn $ "Is empty? " ++ show (isEmpty queue2) + putStrLn $ "Front element: " ++ show (front queue2) + putStrLn "" + + putStrLn "Dequeueing:" + case dequeue queue2 of + Just (element, newQueue) -> do + putStrLn $ "Dequeued element: " ++ show element + putStrLn $ "New front element: " ++ show (front newQueue) + putStrLn $ "Is empty? " ++ show (isEmpty newQueue) + Nothing -> putStrLn "Queue is empty" +``` + +#### 8. Which of the following is NOT a key characteristic of Haskell? +**Solution:** Mutable variables + +#### 9. Given the following data type declaration, What does the deriving (Show) part indicate? +``` data Color = Red | Green | Blue deriving (Show). ```

+**Solution:** It automatically generates a Show instance for the Color type + +#### 10. Complete the following Haskell function findMax. +``` +-- Consider the following incomplete Haskell function definition for +finding the maximum element in a list +findMax :: [Int] -> Int +findMax [] = ??? +findMax (x:xs) = ??? +-- Your task is to complete the definition of the ’findMax’ function to correctly find and + return the maximum element in the given list ’xs’. +-- Assumption: the list ’xs’ is not empty +``` +**Solution:** +``` +findMax :: [Int] \rightarrow Int +findMax [x] = x +findMax (x:xs) = max$ x (findMax xs) +```