Not a Functor

Not a Functor

Imagine that we’ve created a new type to represent a sorted list of values:

{-# LANGUAGE DerivingStrategies #-}
module SortedListFunctor (SortedList, insertSorted) where

data SortedList a = Empty | Cons a (SortedList a)
  deriving stock (Eq, Show)

insertSorted :: Ord a => a -> SortedList a -> SortedList a
insertSorted a Empty = Cons a Empty
insertSorted a (Cons b bs)
  | a >= b = Cons b (insertSorted a bs)
  | otherwise = Cons a (Cons b bs)

Although SortedList might be useful, it turns out that you can’t write a correct instance of Functor for a SortedList. Try to define Functor yourself and experiment with it’s behavior. See if you can figure out why you can’t write a correct instance.

Hint 1

Some high level hint text

Hint 2

Some more detailed hint text

Hint 3

Even more detailed hint text


A complete solution for the exercise