List of tuples generated through list comprehension
Using high-order functions is not much readable:

userRatings search = concatMap (\film -&gt;
  map ((title film,) . snd)
    $ filter ((==search) . fst) $ ratings film)


You need {-# LANGUAGE TupleSections #-} to be able to write (title film,).

Another useful extension is NamedFieldPuns.

getUserRatings search database
  = [ (title,rate)
    | Film{title, ratings} &lt;- database
    , (user,rate) &lt;- ratings
    , search == user
    ]


Writing Film{title, ratings} instead of Film title _ _ ratings is not only a bit shorter, it also allows you to change/reorder fields in Film without updating getUserRatings.

Btw, in my opinion, splitting getUserRatings in several lines adds more readability than rewriting it somehow.