--- tags: Extras, 2022 title: Practice Problems on Lists and Datatypes --- ## Practice Problems with Lists and Datatypes Remember the basic pattern of a recursive function: ``` fun my-func(alist :: List): cases (List) alist: | empty => ... | link(fst, rst) => ... my-func(rst) ... end end ``` You can solve all of these by filling in the details within this basic pattern. **Problem 1:** Write a function `sum-small` that adds up all the numbers that are smaller than 10 from a list. **Problem 2:** Write a function `concat-firsts` that takes a list of strings and returns a `String` made by concatenating the first letter in each of the input strings (e.g., `concat-firsts([list: "go", "brown", "bears"]) is "gbb"`). **Problem 3:** Write a function `count-has-z` that takes a list of strings and returns the number of strings that contain the letter `"z"`. **Problem 4:** Write a function `stack-images` that takes a list of images and stacks them one on top of the other. **Problem 5:** (bit more challenging) Write a function `combine-images` that takes a list of images and combines them into one image. When an image is more tall than wide, it gets put besides other images; when it is more wide than tall, it gets put on top of other images. Use `image-width` and `image-height` to compute the width and height of images. **Problem 6:** Imagine that we had the following data block for email messages: ``` data Email: message( sender :: String, recipient :: String, content :: String, been-read :: Boolean) end ``` Assume that an inbox is a list of messages. Write a function `count-unread` that takes an inbox and input and counts the number of messages that have been read. **Problem 7:** Now write a function `get-unread` that takes an inbox and returns a list with only the unread messages. Write this two ways, once with built-in functions and once with manual recursion.