The exact style is considered by the author as the final style of functional programming. To put it simply, a function of type t1 -> t2 describes a conversion from one element of type t1 to another element of type t2 . The idea is that the "point" functions (written using explicit variables) emphasize the elements (when you write \x -> ... x ... you describe what happens to the element x ), while the functions "without dots "(expressed without the use of variables) emphasize the transformation itself, as part of simpler transformations. A bespectacled style advocate argues that transformation really needs to be a central concept and that point designation, being easy to use, distracts us from this noble ideal.
Pointless functional programming has been available for a very long time. This was already known to logicians who studied combinational logic after the semantic work of Moses Schonfinkel in 1924 and served as the basis for the first study of what would become the ML type of the conclusion of Robert Feis and ... Haskell Curry in the 1950s.
The idea of constructing functions from an expressive set of core combinators is very attractive and is applied in various fields, such as array manipulation languages derived from APL or parser combinator libraries such as Haskell Parsec . A notable proponent of point programming is John Beckus . In a 1978 speech, “Is it possible to free programming from von Neumann's style?”, He wrote:
A lambda expression (with its substitution rules) is capable of defining all possible computable functions of all possible types and any number of arguments. This freedom and power have disadvantages as well as obvious advantages. This is analogous to the power of unlimited control statements in ordinary languages: unlimited freedom is chaos. If one constantly invents new combinations of forms suitable for this occasion, since in the lambda calculus one may not get to know the style or useful properties of several combining forms that are adequate for all purposes. Like structured programming, it avoids many test statements to obtain programs with a simpler structure, better properties, and common methods for understanding their behavior, so functional programming avoids lambda expression, substitution, and multiple function types. Thus, he implements programs created with familiar functional forms with known useful properties. These programs are so structured that their behavior can often be understood and proven by mechanical use of algebraic methods similar to those used to solve high school algebra problems.
So there they are. The main advantage of point programming is that they create a structured combinator style that makes rational reasoning natural. Equational reasoning was especially touted by supporters of the Squiggol movement (see [1] [2]) and indeed uses a fair share of point combinators and calculation / rewriting / reasoning rules.
Finally, one of the reasons for the popularity of point programming among heckellites is its relation to category theory. In category theory, morphisms (which can be considered as “transformations between objects”) are the main object of study and computation. Although the partial results allow us to reason in certain categories in a precise style, the general way of constructing, exploring, and manipulating arrows is still a meaningless style, and other syntaxes, such as string diagrams, also demonstrate this "pointfreeness". There are rather close connections between people who promote methods of "programming algebra" and users of categories in programming (for example, the authors of a banana newspaper [2] / are hardcore categorists).
You might be interested in the Pointfree page on the Haskell wiki.
The disadvantage of the pointfree style is pretty obvious: it can be a real pain to read. The reason we still love to use variables, despite the many horrors of shading, alpha equivalence, etc., is because it is a notation that is so natural to read and think. The general idea is that a complex function (in a transparent reference language) is similar to a complex water supply system: input parameters - they enter some pipes, apply to internal functions, are duplicated ( \x -> (x,x) ) or forgotten ( \x -> () , not leading pipe anywhere), etc. And the variable notation is well hidden about all the machines: you specify the name of the entrance and the names of the outputs (or auxiliary calculations), but you do not need to describe the entire water supply plan, where small pipes will not be an obstacle for larger ones, etc. The amount of plumbing inside something short than \(f,x,y) -> ((x,y), fxy) is amazing. You can monitor each variable separately or read each intermediate node plumbing, but you will never have to see the whole machine together. When you use a style without dots, it is all explicit, you have to write everything down and look at it later, and sometimes just ugly.
PS: this vision of plumbing is closely related to the stack programming languages, which are probably the least accurate programming languages (hardly used). I would recommend trying to do some programming for them to just feel it (as I would recommend logical programming). See Factor , Cat or the venerable Forth .