Jump to content
Wikipedia The Free Encyclopedia

Functor (functional programming)

From Wikipedia, the free encyclopedia
Design pattern in pure functional programming
This article is about the design pattern for mapping functions over a generic type. For the term "functor" as used in C++, see function object.
Applying fmap (+1) to a binary tree of integers increments each integer in the tree by one.

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:

classFunctorfwhere
fmap::(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,[1] which state that the mapping operation preserves the identity function and composition of functions:

fmapid=id
fmap(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).

Examples

[edit ]

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

fmapf[]=[]
fmapf(x:xs)=(fx):fmapfxs

A binary tree may similarly be described as a functor:

dataTreea=Leaf|Nodea(Treea)(Treea)
instanceFunctorTreewhere
fmapfLeaf=Leaf
fmapf(Nodexlr)=Node(fx)(fmapfl)(fmapfr)

If we have a binary tree tr :: Tree a and a function f :: a -> b, the function fmap f tr will apply f to every element of tr. For example, if a is Int, adding 1 to each element of tr can be expressed as fmap (+ 1) tr.[2]

See also

[edit ]

References

[edit ]
  1. ^ Yorgey, Brent. "Functor > Laws". HaskellWiki. Retrieved 17 June 2023.
  2. ^ "Functors". Functional Pearls. University of Maryland. Retrieved 12 December 2022.
[edit ]
Gang of Four
patterns
Creational
Structural
Behavioral
Concurrency
patterns
Architectural
patterns
Other
patterns
Books
People
Communities
See also

AltStyle によって変換されたページ (->オリジナル) /