In
computer science
Computer science is the study of computation, information, and automation. Computer science spans Theoretical computer science, theoretical disciplines (such as algorithms, theory of computation, and information theory) to Applied science, ...
, arrows or bolts are a
type class
In computer science, a type class is a type system construct that supports ad hoc polymorphism. This is achieved by adding constraints to type variables in parametrically polymorphic types. Such a constraint typically involves a type class T a ...
used in
programming to describe
computation
A computation is any type of arithmetic or non-arithmetic calculation that is well-defined. Common examples of computation are mathematical equation solving and the execution of computer algorithms.
Mechanical or electronic devices (or, hist ...
s in a
pure and
declarative fashion. First proposed by computer scientist
John Hughes as a generalization of
monad
Monad may refer to:
Philosophy
* Monad (philosophy), a term meaning "unit"
**Monism, the concept of "one essence" in the metaphysical and theological theory
** Monad (Gnosticism), the most primal aspect of God in Gnosticism
* ''Great Monad'', an ...
s, arrows provide a
referentially transparent way of expressing relationships between ''logical'' steps in a computation.
Unlike monads, arrows don't limit steps to having one and only one input. As a result, they have found use in
functional reactive programming
Functional reactive programming (FRP) is a programming paradigm for reactive programming (asynchronous dataflow programming) using the building blocks of functional programming (e.g., map, reduce, filter). FRP has been used for programming graph ...
,
point-free programming, and
parser
Parsing, syntax analysis, or syntactic analysis is a process of analyzing a string of symbols, either in natural language, computer languages or data structures, conforming to the rules of a formal grammar by breaking it into parts. The term '' ...
s among other applications.
Motivation and history
While arrows were in use before being recognized as a distinct class, it wasn't until 2000 that John Hughes first published research focusing on them. Until then, monads had proven sufficient for most problems requiring the combination of program logic in pure code. However, some useful libraries
A library is a collection of Book, books, and possibly other Document, materials and Media (communication), media, that is accessible for use by its members and members of allied institutions. Libraries provide physical (hard copies) or electron ...
, such as the Fudgets library for graphical user interface
A graphical user interface, or GUI, is a form of user interface that allows user (computing), users to human–computer interaction, interact with electronic devices through Graphics, graphical icon (computing), icons and visual indicators such ...
s and certain efficient parsers, defied rewriting in a monadic form.[
The formal concept of arrows was developed to explain these exceptions to monadic code, and in the process, monads themselves turned out to be a ]subset
In mathematics, a Set (mathematics), set ''A'' is a subset of a set ''B'' if all Element (mathematics), elements of ''A'' are also elements of ''B''; ''B'' is then a superset of ''A''. It is possible for ''A'' and ''B'' to be equal; if they a ...
of arrows.[ Since then, arrows have been an active area of research. Their underlying laws and operations have been refined several times, with recent formulations such as arrow calculus requiring only five laws.]
Relation to category theory
In category theory
Category theory is a general theory of mathematical structures and their relations. It was introduced by Samuel Eilenberg and Saunders Mac Lane in the middle of the 20th century in their foundational work on algebraic topology. Category theory ...
, the Kleisli categories of all monad
Monad may refer to:
Philosophy
* Monad (philosophy), a term meaning "unit"
**Monism, the concept of "one essence" in the metaphysical and theological theory
** Monad (Gnosticism), the most primal aspect of God in Gnosticism
* ''Great Monad'', an ...
s form a proper subset of Hughes arrows.[ While Freyd categories were believed to be ]equivalent
Equivalence or Equivalent may refer to:
Arts and entertainment
*Album-equivalent unit, a measurement unit in the music industry
*Equivalence class (music)
*'' Equivalent VIII'', or ''The Bricks'', a minimalist sculpture by Carl Andre
*'' Equiva ...
to arrows for a time, it has since been proven that arrows are even more general. In fact, arrows are not merely equivalent, but directly equal to enriched Freyd categories.
Definition
Like all type classes, arrows can be thought of as a set of qualities that can be applied to any data type
In computer science and computer programming, a data type (or simply type) is a collection or grouping of data values, usually specified by a set of possible values, a set of allowed operations on these values, and/or a representation of these ...
. In the Haskell programming language
Haskell () is a general-purpose, statically typed, purely functional programming language with type inference and lazy evaluation. Designed for teaching, research, and industrial applications, Haskell pioneered several programming language f ...
, arrows allow functions (represented in Haskell by ->
symbol) to combine in a reified form. However, the actual term "arrow" may also come from the fact that some (but not all) arrows correspond to the morphism
In mathematics, a morphism is a concept of category theory that generalizes structure-preserving maps such as homomorphism between algebraic structures, functions from a set to another set, and continuous functions between topological spaces. Al ...
s (also known as "arrows" in category theory) of different Kleisli categories. As a relatively new concept, there is not a single, standard definition, but all formulations are logically equivalent, feature some required methods, and strictly obey certain mathematical laws.
Functions
The description currently used by the Haskell standard libraries ''requires'' only three basic operations:
* A type constructor
In the area of mathematical logic and computer science known as type theory, a type constructor is a feature of a typed formal language that builds new types from old ones. Basic types are considered to be built using nullary type constructors. So ...
that takes functions from any type to another , and lifts those functions into an arrow between the two types.
arr : (s -> t) -> A s t
* A piping method that takes an arrow between two types and converts it into an arrow between tuple
In mathematics, a tuple is a finite sequence or ''ordered list'' of numbers or, more generally, mathematical objects, which are called the ''elements'' of the tuple. An -tuple is a tuple of elements, where is a non-negative integer. There is o ...
s. The first elements in the tuples represent the portion of the input and output that is altered, while the second elements are a third type describing an unaltered portion that bypasses the computation.[
first : A s t -> A (s,u) (t,u)
* As all arrows must be ]categories
Category, plural categories, may refer to:
General uses
*Classification, the general act of allocating things to classes/categories Philosophy
*Category of being
* ''Categories'' (Aristotle)
*Category (Kant)
*Categories (Peirce)
*Category (Vais ...
, they inherit a third operation from the class of categories: A composition
Composition or Compositions may refer to:
Arts and literature
*Composition (dance), practice and teaching of choreography
* Composition (language), in literature and rhetoric, producing a work in spoken tradition and written discourse, to include ...
operator that can attach a second arrow to a first as long as the first function's output and the second's input have matching types.[
(>>>) : A s t -> A t u -> A s u
Although only these three procedures are strictly necessary to define an arrow, other methods can be derived to make arrows easier to work with in practice and theory.
One more helpful method can be derived from and (and from which can be derived):
* A merging operator that takes two arrows, possibly with different input and output types, and fuses them into one arrow between two compound types. The merge operator is ''not'' necessarily ]commutative
In mathematics, a binary operation is commutative if changing the order of the operands does not change the result. It is a fundamental property of many binary operations, and many mathematical proofs depend on it. Perhaps most familiar as a pr ...
.[
(***) : A s t -> A u v -> A (s,u) (t,v)
]
Arrow laws
In addition to having some well-defined procedures, arrows must obey certain rules for any types they may be applied to:
* Arrows must always preserve all types' identities (essentially the definitions of all values for all types within a category).[
arr id id
* When connecting two functions & , the required arrow operations must distribute over compositions from the left.][
arr (f >>> g) arr f >>> arr g
first (f >>> g) first f >>> first g
* In the previous laws, piping can be applied directly to functions because order must be irrelevant when piping & lifting occur together.][
arr (first f) first (arr f)
The remaining laws restrict how the piping method behaves when the order of a composition is reversed, also allowing for simplifying expressions:
* If an identity is merged with a second function to form an arrow, attaching it to a piped function must be commutative.][
arr (id *** g) >>> first f first f >>> arr (id *** g)
* Piping a function before type simplification must be equivalent to simplifying type before connecting to the unpiped function.][
first f >>> arr ((s,t) -> s) arr ((s,t) -> s) >>> f
* Finally, piping a function twice before reassociating the resulting tuple, which is nested, should be the same as reassociating the nested tuple before attaching a single bypass of the function. In other words, stacked bypasses can be flattened by first bundling together those elements unchanged by the function.][
first (first f) >>> arr ( ((s,t),u) -> (s,(t,u)) )
arr ( ((s,t),u) -> (s,(t,u)) ) >>> first f
]
Applications
Arrows may be extended to fit specific situations by defining additional operations and restrictions. Commonly used versions include arrows with choice, which allow a computation to make conditional decisions, and arrows with feedback
Feedback occurs when outputs of a system are routed back as inputs as part of a chain of cause and effect that forms a circuit or loop. The system can then be said to ''feed back'' into itself. The notion of cause-and-effect has to be handle ...
, which allow a step to take its own outputs as inputs. Another set of arrows, known as arrows with application, are rarely used in practice because they are actually equivalent to monads.[
]
Utility
Arrows have several benefits, mostly stemming from their ability to make program logic explicit yet concise. Besides avoiding side effects
In medicine, a side effect is an effect of the use of a medicinal drug or other treatment, usually adverse but sometimes beneficial, that is unintended. Herbal and traditional medicines also have side effects.
A drug or procedure usually used ...
, purely functional programming
In computer science, purely functional programming usually designates a programming paradigm—a style of building the structure and elements of computer programs—that treats all computation as the evaluation of function (mathematics), mathematic ...
creates more opportunities for static code analysis
In computer science, static program analysis (also known as static analysis or static simulation) is the analysis of computer programs performed without executing them, in contrast with dynamic program analysis, which is performed on programs duri ...
. This in turn can theoretically lead to better compiler optimization
An optimizing compiler is a compiler designed to generate code that is optimized in aspects such as minimizing program execution time, memory usage, storage size, and power consumption. Optimization is generally implemented as a sequence of op ...
s, easier debugging
In engineering, debugging is the process of finding the Root cause analysis, root cause, workarounds, and possible fixes for bug (engineering), bugs.
For software, debugging tactics can involve interactive debugging, control flow analysis, Logf ...
, and features like syntax sugar.[
Although no program strictly requires arrows, they generalize away much of the dense function passing that pure, declarative code would otherwise require. They can also encourage ]code reuse
Code reuse is the practice of using existing source code to develop software instead of writing new code. ''Software reuse'' is a broader term that implies using any existing software asset to develop software instead of developing it again. An as ...
by giving common linkages between program steps their own class definitions. The ability to apply to types generically also contributes to reusability and keeps interfaces simple.[
Arrows do have some disadvantages, including the initial effort of defining an arrow that satisfies the arrow laws. Because monads are usually easier to implement, and the extra features of arrows may be unnecessary, it is often preferable to use a monad.][ Another issue, which applies to many ]functional programming
In computer science, functional programming is a programming paradigm where programs are constructed by Function application, applying and Function composition (computer science), composing Function (computer science), functions. It is a declarat ...
constructs, is efficiently compiling
In computing, a compiler is a computer program that translates computer code written in one programming language (the ''source'' language) into another language (the ''target'' language). The name "compiler" is primarily used for programs tha ...
code with arrows into the imperative style used by computer instruction set
In computer science, an instruction set architecture (ISA) is an abstract model that generally defines how software controls the CPU in a computer or a family of computers. A device or program that executes instructions described by that ISA, s ...
s.
Limitations
Due to the requirement of having to define an arr
function to lift pure functions, the applicability of arrows is limited. For example, bidirectional transformations cannot be arrows, because one would need to provide not only a pure function, but also its inverse, when using arr
. This also limits the use of arrows to describe push-based reactive frameworks that stop unnecessary propagation. Similarly, the use of pairs to tuple values together results in a difficult coding style that requires additional combinators to re-group values, and raises fundamental questions about the equivalence of arrows grouped in different ways. These limitations remain an open problem, and extensions such as Generalized Arrows[ and N-ary FRP] explore these problems.
Much of the utility of arrows is subsumed by more general classes like Profunctor (which requires only pre- and postcomposition with functions), which have application in optics
Optics is the branch of physics that studies the behaviour and properties of light, including its interactions with matter and the construction of optical instruments, instruments that use or Photodetector, detect it. Optics usually describes t ...
. An arrow is essentially a strong profunctor that is also a category, although the laws are slightly different.
References
External links
{{Wikibooks, Haskell, Arrows
Arrows: A General Interface to Computation
Ross Paterson, in ICFP, Sep 2001.
ghc manual
Functional programming