> Of course that type doesn't encode everything there is to know about that function, even assuming purity.
Right—we need to require foo id = id.
Right—we need to require foo id = id.
But since you can't compare 2 functions for equality, and you can't compare two arbitrary values for equality, then yes - your informal requirement is enough togethet with the type to force the function to be `map`.