Topic summary

Functor (functional programming)

Functor (functional programming)

In functional programming, a functor is a design pattern inspired by the definition from category theory that allows one to apply a function to values inside a generic type without changing the structure of the generic type. In Haskell this idea can be captured in a type class:

classFunctorfwherefmap::(a->b)->fa->fb

This declaration says that any instance of Functor must support a method fmap, which maps a function over the elements of the instance.

Functors in Haskell should also obey the so-called functor laws, which state that the mapping operation preserves the identity function and composition of functions:

fmapid=idfmap(g.h)=(fmapg).(fmaph)

where . stands for function composition.

In Scala a trait can instead be used:

traitFunctor[F[_]]{defmap[A,B](a:F[A])(f:A=>B):F[B]}

Functors form a base for more complex abstractions like applicative functors, monads, and comonads, all of which build atop a canonical functor structure. Functors are useful in modeling functional effects by values of parameterized data types. Modifiable computations are modeled by allowing a pure function to be applied to values of the "inner" type, thus creating the new overall value which represents the modified computation (which may have yet to run).