Что такое бинарный оператор функции моноидов на примере JavaScript - PullRequest
1 голос
/ 22 марта 2019

В этой статье Функциональные моноиды представлены кодом C # и определением типа Haskell.

Функция a -> b является моноидом, если b является моноидом. Это означает, что Вы можете комбинировать две функции одного типа. В объектно-ориентированный контекст, это означает, что вы можете объединить два метода с той же сигнатурой в одном методе до тех пор, пока тип возвращаемого значения образует моноид.

1010 * обобщение * Хотя приведенный выше код C # является лишь примером, общее правило таково, что любая функция, которая возвращает моноид, сама является моноидом. В Хаскеле это правило сформулировано в стандартной библиотеке: instance Monoid b => Monoid (a -> b) Это означает, что для любого моноида b функция a -> b также (автоматически) моноид.

Проблема в том, что пример в C # слишком специфичен для «GUID», и я понятия не имею, что автор пытается сделать в коде, а определение типа в Haskell является просто определением типа.

Что такое пример кода в JavaScript для реализации этой функции Monoids?

ср) Почему instance Monoid b => Monoid (a -> b) в базе?

Ответы [ 2 ]

1 голос
/ 22 марта 2019

моноидные законы

закон идентичности:
combine (identity, a) == combine (a, identity)

закон ассоциативности:
combine (a, combine (b, c)) == combine (combine (a, b), c)

Мы можем реализовать элемент идентификации (identity) и двоичную операцию (combine) для функций -

// identity element
const identity =
  x => x

// binary operation
const combine = (a, b) =>
  x => a (b (x))
 
// sample functions
const a =
  x => x + 3
  
const b =
  x => x - 1

const c =
  x => x * x

// uphold laws
console.log
  ( combine (identity, a) (2) === combine (a, identity) (2)
  , combine (a, combine (b, c)) (2) === combine (combine (a, b), c) (2)
  )
  
// => true
// => true

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

Конечно, вы не ограничены этими доменами.Ваш пользовательский тип может иметь различные двоичные операции и элементы идентичности, которые удовлетворяют законам моноидов.Если законы соблюдены, ваш тип относится к категории моноидов.

1 голос
/ 22 марта 2019

Важно знать, что способность комбинировать вещи не обязательно означает, что они моноиды.Чтобы что-то было моноидом, оно должно иметь ассоциативность, левую идентичность и правую идентичность.

C #:

public static Func<Guid, int> Combine(
    Func<Guid, int> f,
    Func<Guid, int> g)
{
    return x => f(x) + g(x);
}

JS:

function combine(f,g) {
    return x => f(x) + g(x)
}

function addOne(x) {
  return x + 1;
}

function addTwo(x) {
  return x + 2;
}

let newFunction = combine(addOne, addTwo);
let result = newFunction(0);
console.log(result)
...