Что такое стиль “без точек” (в функциональном программировании)?

StackOverflow https://stackoverflow.com/questions/944446

Вопрос

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

Во-первых, там было это вопрос, и также этот.

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

Что такое стиль "без очков"?Кто-нибудь может дать краткое объяснение?Имеет ли это какое-то отношение к "автоматическому" приготовлению карри?

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

Это было полезно?

Решение

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

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

Пример 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, вы можете определить его как "заполненный точкой" следующим образом:

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('. ');
};

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'

Ссылка

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

Это работает в 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;
    }
  }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top