O que é o estilo point free Em Programação Funcional?

uma frase que eu notei recentemente é o conceito de "ponto livre" estilo...

Primeiro, havia esta pergunta, e também esta .

Então, eu descobri aqui eles mencionam " outro tópico que pode valer a pena discutir é a antipatia dos autores do estilo livre de pontos."

O que é o estilo" sem pontos"? Alguém pode dar uma explicação concisa? Tem alguma coisa a ver com o encarceramento "automático"?

Para ter uma ideia do meu nível - Tenho andado a ensinar-me um esquema, e tenho escrito um simples intérprete de esquemas... Eu entendo o que é" enrolar implícito", mas não conheço nenhum Haskell ou ML.

Author: Community, 2009-06-03

5 answers

Basta olhar para o artigo da Wikipédia para obter a sua definição:

Programação tácita (programação sem pontos) é um paradigma de programação em que uma definição de função não inclui informações sobre seus argumentos, usando combinadores e composição de funções [...] em vez de variáveis.

Haskell exemplo:

Convencional (você especifica os argumentos explicitamente):

sum (x:xs) = x + (sum xs)
sum [] = 0

Sem pontos (sum não tem nenhum explícito argumentos - é apenas uma dobra com + começando com 0):

 sum = foldr (+) 0

Ou ainda mais simples: em vez de g(x) = f(x), podias escrever g = f.

Portanto, sim, está intimamente relacionado com a curtição (ou operações como a composição da função).
 55
Author: Dario, 2015-10-28 02:20:29

O estilo livre de Pontos significa que os argumentos da função a ser definida não são explicitamente mencionados, que a função é definida através da composição da função.

Se tem duas funções, como

square :: a -> a
square x = x*x

inc :: a -> a
inc x = x+1

E se quiser combinar estas duas funções com uma que calcula x*x+1, pode defini-la "point-full" como esta:

f :: a -> a
f x = inc (square x)
A alternativa livre de pontos seria não falar sobre o argumento.x:
f :: a -> a
f = inc . square
 25
Author: sth, 2010-07-09 00:25:28

Uma amostra de JavaScript:

//not pointfree cause we receive args
var initials = function(name) {
  return name.split(' ').map(compose(toUpperCase, head)).join('. ');
};

//pointfree
var initials = compose(join('. '), map(compose(toUpperCase, head)), split(' '));

initials("hunter stockton thompson");
// 'H. S. T'

Referência

 5
Author: Brunno, 2017-04-25 20:12:24

O estilo livre de Pontos significa que o código não menciona explicitamente os seus argumentos, mesmo que existam e estejam a ser usados.

Isto funciona em Haskell por causa da forma como as funções funcionam.

Por exemplo:

myTake = take

Retorna uma função que leva um argumento, portanto, não há razão para especificar o argumento a menos que você apenas queira também.

 4
Author: Rayne, 2009-06-06 14:14:31

Aqui está um exemplo em TypeScript sem qualquer outra biblioteca:

interface Transaction {
  amount: number;
}

class Test {
  public getPositiveNumbers(transactions: Transaction[]) {
    return transactions.filter(this.isPositive);

    //return transactions.filter((transaction: {amount: number} => transaction.amount > 0));
  }

  public getBigNumbers(transactions: Transaction[]) {
    // point-free
    return transactions.filter(this.moreThan(10));

    // not point-free
    // return transactions.filter((transaction: any) => transaction.amount > 10);
  }

  private isPositive(transaction: Transaction) {
    return transactions.amount > 0;
  }

  private moreThan(amount: number) {
    return (transaction: Transaction) => {
      return transactions.amount > amount;
    }
  }
}

Você pode ver que o estilo livre de pontos é mais "fluente" e mais fácil de ler.

 -1
Author: AZ., 2018-02-22 00:26:07