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.