One of the first cool things you encounter in functional programming is map
.
Say you have a function length :: String -> Int
which gives the length of a string:
> length "hello" 5(in real haskell, thats not actually the type of
length
but its close enough for now)
Now you can apply that to a list of strings, like this:
> map length ["hello","goodbye"] [5,7]
For most of I've thought of this as meaning "apply the function length
to each element of the list ["hello", "goodbye"]
.
But theres a slightly different interpretation thats a bit more "functional" feeling, that I've come across recently.
Consider only applying the first argument to map (you can do that in haskell...):
map lengthWhats the type of this expression? It is
[String] -> [Int]
. So what its done is converted a function from string to int, into a new function from lists-of-strings to lists-of-ints.And now we have that function that converts a list of strings to lists of ints, we can apply it to a list of strings:
> (map length) ["hello","goodbye"] [5,7]
So the different reading that I see now is "lift this function to work on lists", first, followed by application to a list.
The same new intuition applies to functors in general and fmap, and its from thinking more about category theory that this view of things starts to appeal to me.