Что такое бинарный оператор Function Monoids в примере JavaScript

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

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

Обобщение

Хотя приведенный выше код C # является только примером, общее правило состоит в том, что любая функция, возвращающая моноид, сама является моноидом. В Haskell это правило сформулировано в стандартной библиотеке:

instance Monoid b => Monoid (a -> b)

Это означает, что для любого моноида b функция a -> b также (автоматически) является моноидом.

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

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

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


person Community    schedule 21.03.2019    source источник
comment
Учитывая, что javascript не имеет достаточно сложной системы типов, его довольно сложно перевести. Быть моноидом - это не то, что можно выразить как значение времени выполнения. Я бы порекомендовал изучить Haskell, чтобы понять, что означает эта статья, если вам это интересно.   -  person Bergi    schedule 22.03.2019
comment
Я не согласен. Для реализации моноидов в JavaScript система типов вообще не требуется. То же самое и с Мондасом.   -  person    schedule 22.03.2019
comment
Пример C # вообще не специфичен для GUID. Суть статьи - функция Combine, которую вы сможете перевести в javascript даже без каких-либо знаний C #. CountPrimes и CountLetters используются просто как примеры функций, которые будут использоваться в качестве аргументов для Combine.   -  person Bergi    schedule 22.03.2019
comment
Вы работаете с какой-либо конкретной реализацией моноидов в JavaScript? Существуют десятки подходов к переводу четкой теоретико-типовой конструкции в код JS, и мы не можем знать, какой вариант вам подходит. Если вы можете опубликовать его, и желательно экземпляр моноида, который вы хотели бы видеть в примере, я могу попытаться написать ответ.   -  person Bergi    schedule 22.03.2019
comment
@tbookq ну тогда ... что тебе мешает показать нам пример того, что ты имеешь в виду? : D   -  person Nelson Teixeira    schedule 22.03.2019
comment
@tbookq Я пишу комментарии, потому что еще не ответил на ваш вопрос Какой пример кода в JavaScript для реализации этой функции Monoids?. Я пишу комментарии, чтобы предложить способы улучшить ваш вопрос, чтобы я мог правильно ответить на него с помощью полезного и понятного поста.   -  person Bergi    schedule 22.03.2019
comment
@NelsonTeixeira - много реализаций монад в JavaScript, и это здесь не в теме, и это я прошу показать нам пример моноидов функций в JavaScript.   -  person    schedule 22.03.2019
comment
@tbookq Пожалуйста, отредактируйте свой вопрос, включив в него произвольную реализацию моноида в качестве примера (и чтобы продемонстрировать свой уровень знаний) , и я напишу соответствующий ответ. Я не хочу писать бесполезный для вас ответ, но вам нужно будет предоставить дополнительную информацию. Это ты хочешь, чтобы другие помогли ему.   -  person Bergi    schedule 22.03.2019


Ответы (2)


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

закон о личности:
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

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

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

person Mulan    schedule 21.03.2019
comment
Спасибо, но x => a (b (x)) - это композиция функций, то есть эндоморфизм-моноид, о котором эта тема не идет. blog.ploeh.dk/2017/11/13/endomorphism-monoid В Haskell это называется Endo Monoid. - person ; 22.03.2019
comment
Возникает вопрос: Что такое бинарный оператор функциональных моноидов в примере JavaScript?. Этот ответ объясняет, что любой элемент идентичности и бинарная операция, удовлетворяющая законам моноида, образует моноид. В ответе также показан пример моноида функции в JavaScript. В связанной таблице Википедии показаны другие пары, которые также образуют моноиды. Думаю, у вас неправильный заголовок вопроса или, может быть, вы не понимаете, о чем спрашиваете. - person Mulan; 22.03.2019
comment
Что ж, я написал книгу о функциональном программировании, опубликованную одним из крупнейших издателей Японии. Итак, я знаю, о чем говорю. Вопрос относится к конкретному моноиду с примером и ему соответствует заголовок. Я хорошо знаю Моноид, и не спрашиваю здесь Моноидный Закон и т. Д., Который я тоже хорошо знаю. Ваш ответ непочтительный, так как он не соответствует вопросу. Извините. - person ; 22.03.2019
comment
Вы очень быстро отвергли других и заявили о себе. Я вижу, вы очень гордитесь своими полномочиями, возможно, до ошибки. Вы удосужились взглянуть на полномочия людей, предлагающих свою помощь? Берги - один из самых знающих участников по этой теме здесь, на SO; также терпеливый и уважительный. Кажется, вы точно знаете, чего хотите, поэтому я оставлю вас, чтобы вы это нашли. - person Mulan; 22.03.2019
comment
Дело в том, что мой вопрос решен. Это сайт вопросов и ответов. Ответить на собственный вопрос не запрещено, я тоже. Возможно, это хорошая идея, что вы также исследуете свое поведение, заявив, что заголовок вашего вопроса неправильный, в том, что нет ничего плохого в представлении конкретного примера и определения. Это простой и ясный эндоморфизм-моноид в вашем ответе или идентификационная функция, которая здесь не по теме. - person ; 22.03.2019
comment
Мне интересно прочитать вашу книгу. Не могли бы вы поделиться названием? - person Mulan; 22.03.2019
comment
Это в Amazon Japan, и да, я не против обсудить то, что не в теме. Спасибо. - person ; 22.03.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)

person Nick Acosta    schedule 21.03.2019
comment
Спасибо, мне, вероятно, следует спросить не только о combine операции, поскольку это, по крайней мере, не имеет смысла, и да, это приведет к ошибке. Небольшой рабочий код, пожалуйста, в S.O.Snippet. - person ; 22.03.2019
comment
Combine - это функция, которая принимает два аргумента, в данном случае предполагается, что эти аргументы являются функциями. combine фактически вернет новую функцию, которая принимает один аргумент. Внутри этой новой функции каждый аргумент f и g будет применен к x, и их результаты будут добавлены вместе. Надеюсь, это облегчит понимание. - person Nick Acosta; 22.03.2019