Some thoughts about Puzzle 109: Suppose we had an employee record like this:

let r = new Employee in

Then we can apply our two functions and get a string:

departmentName(worksIn(r)) = "engineering"

What I find somewhat natural is to turn the functor F around (let me call that G), so we can find out the type of our data:

G(r) = Employee

Note that the value is a type, hence I had to write "=" rather than ":". However, because we're dealing with a functor, we can expect to get another G which can do this:

G(departmentName o worksIn) = Employee -> String

_Edit: After writing my reply to Simon Willerton's response I felt the word "String" should start with an uppercase letter._

But that's not what F does. F cannot point to any specific record (none of the F's can do that). Instead it maps a schema to the set of all possible records conforming to the schema C.

I'm not sure if this makes a lot of sense, but I think it's about somethjng which might bug programmers who'd like to learn about category theory.