That's not really how I visualize functors. Let's go back to the function picture:<p><pre><code> --- ---
|a| -- f --> |b|
--- ---
</code></pre>
This is fairly simple--using f, you can go from a to b.<p>Now lets imagine a functor F (with f still being our function):<p><pre><code> --- ---
|a| -- f --> |b|
--- ---
| |
|F|
\ /
V
---- ----
|a'| -- f' --> |b'|
---- ----
</code></pre>
So a functor is just a function at a higher level. A function maps values of one type to values of another type. A functor maps types to other types. In Haskell, types in the Functor class always map types of kind * back onto * , so they're much like functions of type a -> a.<p>The crucial part to notice is that it not only maps between types but it also <i>preserves</i> functions. That is, you get new types corresponding to your old types and new functions corresponding to your old functions.<p>So the list type, for example, maps any type a to [a] and any function (a -> b) to ([a] -> [b]). In a sense, it is like a well-behaved function between types.<p>Coincidentally, thinking of functors like this is how I realized that functors in Haskell are <i>not</i> completely unrelated to functors in OCaml--they're just different reifications of the same mathematical idea.