What is "point free" style (in Functional Programming)?

30,813

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'

Reference

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.

Share:
30,813
Paul Hollingsworth
Author by

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, 2020

Comments

  • Paul Hollingsworth
    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
    Paul Hollingsworth almost 15 years
    Ahh I see! So you build up new functions always just by combining other functions rather than declaring arguments... Very elegant!
  • Dan
    Dan almost 14 years
    Stupidly, 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
    kaleidic over 13 years
    In what way is it related to Currying?
  • Hans-Kristian Norum Eidesen
    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
    Ehtesh Choudhury over 12 years
    Don't you mean sum (x:xs) ... instead of sum sum (x:xs) ... ?
  • Ehtesh Choudhury
    Ehtesh Choudhury over 12 years
    Sometimes, it doesn't work in Haskell 98, as in myShow = show. There's more about it on the Haskell wiki
  • Vincent Savard
    Vincent Savard over 11 years
    Concerning @Dan's comment, the Pointfree HaskellWiki page offers an explanation of why it is called pointfree.
  • Sebastian Mach
    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
    kralyk almost 6 years
    That's not point-free style, that's just distinction between a lambda and a named function.
  • loverboy
    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 a transaction as its input.
  • joonghyup cha
    joonghyup cha about 4 years
    Can you explain why we need the parens, and we can't simply use sum = foldr + 0 ?
  • Qiulang
    Qiulang over 3 years
    The link has changed to github.com/MostlyAdequate/mostly-adequate-guide/blob/master/‌​… But I can't make the code run
  • Wezl'
    Wezl' about 3 years
    @joelittlejohn because then it thinks it's adding foldr and 0, so parentheses are necessary for infix functions in haskell