Exercises for generic programming in Haskell

Hugs is available on kand-4 and kand-5. When using Hugs, use the "-98" flag on the command line to activate extensions such as multi-parameter type classes, i.e.

prompt> hugs -98

You can specify a .hs file as a command-line parameter, or you can load it inside hugs using the :l command, e.g., :l exercise.hs. You can reload the active source file by the :l command (without parameters). Writing :t expression will tell you the type of an expression.

  1. Write a type class FunMap for finite maps from any type A to any type B. It should have the following functions:

    emptyMap: A map that maps every input to Nothing.

    mapTo: Given a pair (x,y)::(A,B), mapTo returns a map that maps x to Just y and everything else to Nothing.

    find: Given a map m and an element x::A returns what m maps x to.

    join: Given two maps m1 and m2, return a map m3 such that if m1 maps x to Just y, m3 also maps x to Just y, but if m1 maps x to Nothing, m3maps x to whatever m2 maps x to.

    Note that Nothing and Just are predefined constructors of the type Maybe B (corresponding to SML's option type).

  2. Write two instances of the FinMap class: One where a map from A to B is implemented as [(A,B)] (i.e., a list of pairs) and another where it is implemented as (A -> Maybe B), i.e., a function from A to Maybe B.

  3. Write a type class Finite a, som har en "metode":

    elements :: [a]

    which gives a list of all elements in a.

    Write instanses of Finite for Bool, for pairs (A,B), where A and B are Finite and for Maybe A, where A is Finite. Bool and Maybe a are predefined types, defined by:

    Bool = True | False

    Maybe a = Nothing | Just a

    show the result of elements :: [(Bool,Maybe Bool)].

  4. Load examples.hs (shown below) into Hugs. Use :t to show the types for f, f1, f2 and f3. Explain the types. Hints: Start from the bottom, as they are in decreasing difficulty. Use :t to show the types for the elements used, such as 1, 0.2, (-1) and sin. Note that Fractional is a superclass of Floating. Note, also, that map -1 xs is parsed as map - (1 xs).

    f xs = map -1 xs

    f1 xs = map (-1) xs

    f2 x = [x] : [4,5,6]

    f3 r = r * sin 0.2