Functor
The Functor type-class gives us a way to generalize function application to arbitrary types. Let's first look at regular function application. Suppose we defined a function of primitive types:
f :: Num a => a -> a f = (^2)
We can apply it directly to the types it was intended for:
f 5 f 5.0 –- etc
To apply the f
function to a richer type, we need to make that type an instance of Functor
and then use the fmap
function:
-- fmap function Functor fmap f (Just 5) fmap (f . read) getLine
The Functor
type-class defines fmap
:
class Functor f where fmap :: (a -> b) -> f a -> f b
Let's create our own Maybe'
type and make it an instance of Functor
:
data Maybe' a = Just' a | Nothing' deriving (Show) instance Functor Maybe' where fmap _ Nothing' = Nothing' fmap f (Just' x) = Just' (f x)
By making Maybe'
a Functor
type-class, we are describing how single-parameter functions may be applied to our type, assuming the function types align with...