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:

class Functor f where
fmap :: -> f a -> f b

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:

fmap id = id
fmap = .

where . stands for function composition.
In Scala a trait can instead be used:

trait Functor

Functors form a base for more complex abstractions like [Applicative functor">applicative functor
s, monads, and comonads, all of which build atop a canonical functor structure. Functors are [useful">_

Functors form a base for more complex abstractions like [Applicative functor">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.

Examples

In Haskell, lists are a simple example of a functor. We may implement as

fmap f =
fmap f = : fmap f xs

A binary tree may similarly be described as a functor:

data Tree a = Leaf | Node a
instance Functor Tree where
fmap f Leaf = Leaf
fmap f = Node

If we have a binary tree and a function, the function will apply to every element of. For example, if is, adding 1 to each element of can be expressed as.