Spring 2023 Haskell Exam

Problem 1

Write a main function that accepts a single command-line argument representing the current color of a stoplight, which is one of "green", "yellow", or "red". It prints the color that the light will switch to next. For example:

> runhaskell main.hs green
yellow
> runhaskell main.hs red
green
> runhaskell main.hs Red
?
> runhaskell main.hs flung
?

If the argument is any other string or uses a different case, print "?".

Problem 2

Write function mapFromTo that accepts a list of any type and a transformation function. It returns a list of pairs. The first element of each pair is the corresponding element from the original list. The second element is the value to which it transforms. For example:

> mapFromTo length ["a", "an", "the"]
[("a", 1), ("an", 2), ("the", 3)]

Problem 3

Write function days that accepts a year, a month, and a list of dates. Each date is a 3-tuple of a year, month, and day of the month. The function returns the days of the month for those dates that fall in the given year and month. For example:

> days 2023 3 [(2023, 3, 27), (2023, 4, 1), (2023, 3, 15)]
[27, 15]
> days 2023 4 [(2023, 3, 27), (2023, 4, 1), (2023, 3, 15)]
[1]
> days 2023 5 [(2023, 3, 27), (2023, 4, 1), (2023, 3, 15)]
[]

Problem 4

Write a main function that reads in a file whose path is passed as a command-line argument. It prints the number of lines in the file. For example:

> cat vowels.txt
A
E
I
O
U
> runhaskell main.hs vowels.txt
5

Problem 5

Define a Distance data type with two variants. Meters holds a distance in meters. Feet holds a distance in feet. All fields are of type Double.

Define also a Metric typeclass with a function toMetric that turns a value of an implementing type into its metric variant.

Make Distance implement the Metric typeclass. Consider 1 foot to be equivalent to 0.3048 meters. If the value is already metric, it is returned unchanged.

Problem 6

Write function braid that accepts two lists of the same type. It returns a pair of lists that are like the parameters, but every other element has been swapped between the two lists. For example:

> braid "abcd" "1234"
("a2c4", "1b3d")
> braid "dime" "pulpit"
("dump", "pile")

Only elements that have a partner in the other list are included in the braid, as you can see in the second example.