
Hello,
On 8/15/06, John Hughes
... However, this isn't a complete solution, because students still see plenty of class constraints in error messages, and they need to understand them sufficiently well to fix their errors. It's not too hard to explain that "Num a" means that a should be a numeric type--Integer, Double, i.e. a type they are familiar with. It's much harder to explain what "Functor f" means to a student who's still struggling to keep in mind the difference not just between a type and a class, but between a type and a value. The fact that f is a type constructor, and not a familiar type, is an additional obstacle. That makes overloading list operations much more of an obstacle for beginners, than overloading numeric operations is.
I know this is not exactly accurate, but for beginners' purposes one could explain 'Functor' as a container type such as a list or a tree. In any case, if one wanted to avoid the issue, it seems entirely reasonable to define a function 'mapList' that has the list specific type. Most classes probably do this anyway. Students can then simply add it to the beginning of their programs, or (if they know about modules) create their own module, or they could import it from a predefined 'StudentPrelude'. (As someone else pointed out, this is not at all specific to Haskell: I've taken---and helped design---classes for Java and C++ which did exactly this.) When later in the class students learn about overloading, then the lecturer could tell them that the standard library already provides an overloaded 'map' function, that can be used for many different types, and they can start using it. Out of curiosity, how do people explain why 'map' is called that? -Iavor