| COMP1011 Exercises for Week 08 | |
|---|---|
| Computing 1A 05s2 |
Last updated
Tue 19 Jul 2005 14:37
Mail cs1011@cse.unsw.edu.au |
Online book sellers these days usually also sell video tapes and CDs.
So, they need to maintain a product database that is flexible enough to
deal with all three types of goods. In the following, we will define a
module BookVideoCD that contains the necessary data types
to deal with such a database.
First, define a data type Product that can represent any of
the three types of goods. For each good, the following additional
information has to be maintained:
Define appropriate type synonyms for titles, authors, and artists.
Implement a function getTitle that, given a product,
extracts its title. (Note that all three types of products contain
title information.)
Now, use getTitle to implement getTitles,
which, given a list of products, produces a list with all
titles. There are two ways to implement this function: with an explicit
recursive definition or by using the higher-order function
map. Discuss both variants and compare them.
Make sure that everybody understands file permissions in Unix. What is the meaning of the triplets? What are the owner and group of a file? What does execute permission imply for directories?
In the lecture, we briefly discussed the following simple shell script,
hslines, to printing the sum of the numbers of lines of all
Haskell files in the current directory:
#!/bin/sh wc *.hs | tail -1 | cut -d ' ' -f2-2
Discuss how it works and what the individual tools wc,
tail, and cut do.
As a preparation, recall the term partial function that we
discussed earlier. So far, we raised an error whenever a partial
function was applied to an argument on which it wasn't defined. An
alternative would be to return a special value (let's call it
Nothing) whenever we previously raised an error. The
advantage of that is that we can actually test for the error in the
calling function, rather than aborting the whole program.
Define a data type (Maybe a) that can be used for this
purpose.
div
What's the result of evaluating 10 `div` 0? Implement a
safe devision function
safeDiv :: Int -> Int -> Maybe Int
So that 10 `safeDiv` 0 returns Nothing, rather
than aborting with an error message.