What is "point free" style (in Functional Programming)?
Solution 1
Just look at the Wikipedia article to get your definition:
Tacit programming (point-free programming) is a programming paradigm in which a function definition does not include information regarding its arguments, using combinators and function composition [...] instead of variables.
Haskell example:
Conventional (you specify the arguments explicitly):
sum (x:xs) = x + (sum xs)
sum [] = 0
Point-free (sum
doesn't have any explicit arguments - it's just a fold with +
starting with 0):
sum = foldr (+) 0
Or even simpler: Instead of g(x) = f(x)
, you could just write g = f
.
So yes: It's closely related to currying (or operations like function composition).
Solution 2
Point-free style means that the arguments of the function being defined are not explicitly mentioned, that the function is defined through function composition.
If you have two functions, like
square :: a -> a
square x = x*x
inc :: a -> a
inc x = x+1
and if you want to combine these two functions to one that calculates x*x+1
, you can define it "point-full" like this:
f :: a -> a
f x = inc (square x)
The point-free alternative would be not to talk about the argument x
:
f :: a -> a
f = inc . square
Solution 3
A JavaScript sample:
//not pointfree cause we receive args
var initials = function(name) {
return name.split(' ').map(compose(toUpperCase, head)).join('. ');
};
const compose = (...fns) => (...args) => fns.reduceRight((res, fn) => [fn.call(null, ...res)], args)[0];
const join = m => m.join();
//pointfree
var initials = compose(join('. '), map(compose(toUpperCase, head)), split(' '));
initials("hunter stockton thompson");
// 'H. S. T'
Solution 4
Point free style means that the code doesn't explicitly mention it's arguments, even though they exist and are being used.
This works in Haskell because of the way functions work.
For instance:
myTake = take
returns a function that takes one argument, therefore there is no reason to explicit type the argument unless you just want too.
Paul Hollingsworth
I'm a software developer working in financial services in London. Previously I did a lot of C++ - but lately have been doing a lot of .NET and functional programming. Projects: http://patient0.github.com/FirstClassLisp/
Updated on December 09, 2020Comments
-
Paul Hollingsworth over 3 years
A phrase that I've noticed recently is the concept of "point free" style...
First, there was this question, and also this one.
Then, I discovered here they mention "Another topic that may be worth discussing is the authors' dislike of point free style."
What is "point free" style? Can someone give a concise explanation? Does it have something to do with "automatic" currying?
To get an idea of my level - I've been teaching myself Scheme, and have written a simple Scheme interpreter... I understand what "implicit" currying is, but I don't know any Haskell or ML.
-
Paul Hollingsworth almost 15 yearsAhh I see! So you build up new functions always just by combining other functions rather than declaring arguments... Very elegant!
-
Dan almost 14 yearsStupidly, in Haskell, the 'point-free' way is usually the one that looks pointier (more periods). This annoyance makes an excellent mnemonic. (The book Real World Haskell comments on this.)
-
kaleidic over 13 yearsIn what way is it related to Currying?
-
Hans-Kristian Norum Eidesen over 13 years@kaleidic: Because without having variable names, you need to compose partially applied functions. That's what we call currying (or, more precisely, what is made possible through currying)
-
Ehtesh Choudhury over 12 yearsDon't you mean
sum (x:xs) ...
instead ofsum sum (x:xs) ...
? -
Ehtesh Choudhury over 12 yearsSometimes, it doesn't work in Haskell 98, as in
myShow = show
. There's more about it on the Haskell wiki -
Vincent Savard over 11 yearsConcerning @Dan's comment, the Pointfree HaskellWiki page offers an explanation of why it is called pointfree.
-
Sebastian Mach about 11 years@Dan: I don't think it's stupid, as the Haskell point is meant to be "that circle operator" (should look more like ° though). But confusing, it is, especially when you are new to functional programming languages; every intro book on haskell should explain point-free-style.
-
kralyk almost 6 yearsThat's not point-free style, that's just distinction between a lambda and a named function.
-
loverboy almost 6 years@kralyk I think you missed the point,
this.moreThan(10)
is not a named function, it's a curried function as well as a function that'll implicitly (thus point free) take atransaction
as its input. -
joonghyup cha about 4 yearsCan you explain why we need the parens, and we can't simply use
sum = foldr + 0
? -
Qiulang over 3 yearsThe link has changed to github.com/MostlyAdequate/mostly-adequate-guide/blob/master/… But I can't make the code run
-
Wezl' about 3 years@joelittlejohn because then it thinks it's adding
foldr
and0
, so parentheses are necessary for infix functions in haskell