Что такое point free style в функциональном программировании?

фраза, которую я заметил недавно, - это концепция стиля "точка бесплатно"...

во-первых, там был этой сомнение, и и этот.

затем, я обнаружил здесь они упоминают " еще одна тема,которую, возможно, стоит обсудить, - это нелюбовь авторов к стилю point free."

Что такое стиль "point free"? Кто-нибудь может дать краткое объяснение? Это как-то связано с "автоматом" каррирование?

чтобы получить представление о моем уровне - я учил себя схеме и написал простой интерпретатор схемы... Я понимаю, что такое "неявное" карринг, но я не знаю Haskell или ML.

5 ответов


просто посмотри статья в Википедии получить ваше определение:

молчаливое Программирование (точечное программирование)-это парадигма программирования, в которой определение функции не включает информацию о ее аргументах, используя комбинаторы и состав функций [...] вместо переменных.

Haskell пример:

обычный (вы явно указываете аргументы):

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

точки-бесплатно (sum не имеет явных аргументов - это просто складка с + начиная с 0):

 sum = foldr (+) 0

или еще проще: вместо g(x) = f(x), вы могли бы просто написать g = f.

так что да: это тесно связано с карри (или операций, таких как композиция функций).


стиль без точек означает, что аргументы определяемой функции явно не упоминаются, что функция определяется через состав функции.

если у вас есть две функции, как

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

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

и если вы хотите объединить эти две функции в одну, которая вычисляет x*x+1, вы можете определить его "point-full" следующим образом:

f :: a -> a
f x = inc (square x)

свободной от точки альтернативой было бы не говорить о аргументе x:

f :: a -> a
f = inc . square

пример 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'

ссылка


Point free style означает, что код явно не упоминает его аргументы, даже если они существуют и используются.

это работает в Haskell из-за способа работы.

например:

myTake = take

возвращает функцию, которая принимает один аргумент, поэтому нет причин явно вводить аргумент, если вы просто не хотите.


вот один пример в TypeScript без какой-либо другой библиотеки:

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;
    }
  }
}

вы можете видеть, что стиль без точек более "свободно" и легче читать.