 <p>Singular is a computer algebra system. Haskell is a programming language which computer algebra can be implemented within. You need to start simply and just learn basic Haskell syntax and concepts before trying to see the categorical/algebriac picture, especially since different elements can be implemented in different ways.</p> <p>But let's try something simple to establish a common language. The notes I give here should be consistent with the treatment here: <a href="http://en.wikibooks.org/wiki/Haskell/Category_theory" rel="nofollow">http://en.wikibooks.org/wiki/Haskell/Category_theory</a></p> <p>One approach is to describe the category <code>Hask</code>. The objects of <code>Hask</code> are all Haskell types. <code>Hask</code> contains function types, as well as pairs, so it is cartesian closed, and all its arrows are isomorphic to objects. In categorical terms, a hom-set is the collection of all morphisms between two objects. So the hom-set on (Int,Float) is the collection of all functions that turn an Int into a Float. </p> <p>Categorically, a functor between categories X and Y sends the objects of X to Y and the arrows of X to Y. It also therefore sends the hom-sets (collections of arrows) of X to Y.</p> <p>The class <code>Functor</code> in Haskell provides part of what you get with a categorical functor. It provides an operation <code>fmap</code> that sends arrows on objects in <code>Hask</code> to arrows on some other category (which, in our case, must also be composed of <em>some</em> objects from Hask). It can send functions on values to functions on lists of values, or functions on values to functions on pairs which contain values, etc.</p> <p>All that said, I would recommend learning Haskell without thinking about writing type classes or instances at all for some time. Stick to explicit data declarations and functions until you're more comfortable with the basic features of the language.</p>