Что это за комбинатор? - PullRequest
1 голос
/ 30 марта 2020

Я использовал комбинатор, чтобы вычислить среднее из списка чисел ...

const myCombinator = f => g => h => x => f(g(x))(h(x));

Затем я мог бы использовать его как ...

const div = a => b => a/b;
const sum = a => a.reduce((a, n) => a + n, 0);
const length = a => a.length();

const average = myCombinator(div)(sum)(length);

console.log(average([1, 2, 3, 4, 5, 6, 7, 8, 9]));

Тем не менее, я не уверен, какой комбинатор это из списка, как ... http://www.angelfire.com/tx4/cus/combinator/birds.html

Сначала мне сказали, что это комбинатор Блэкберд, но я не думаю, это так? Это правильно?

Это «именованный» комбинатор? Если да, знаете ли вы, какой это?

Из комментариев

Blackbird определяется как ... blackbird :: (c -> d) -> (a -> b -> c) -> a -> b -> d

Однако, Я думаю, что моя функция работает как ...

myCombinator :: (b -> c -> d) -> (a -> b) -> (a -> c) -> a -> d

, т.е. она возвращает функцию, которая принимает a и возвращает d. a передается в две функции, которые создают b и c. Затем они передаются в функцию, которая возвращает d.

После вышеприведенного комментария

Я нашел это! Из @ evolutionxbox link я нашел Starling_ комбинатор ...

starling_ :: (b -> c -> d) -> (a -> b) -> (a -> c) -> a -> d

Именно то, что я написал выше: D

1 Ответ

1 голос
/ 30 марта 2020

Благодаря полезной ссылке от @evolutionxbox мне удалось найти комбинатор Starling_, который определяется как ...

starling_ :: (b -> c -> d) -> (a -> b) -> (a -> c) -> a -> d

В моем случае ...

  • a -> b - это моя sum функция, которая принимает массив и возвращает число.
  • a -> c - это моя length функция, которая принимает массив и возвращает число.
  • b -> c -> d - это моя div функция, которая берет два числа и делит их.

Впервые я чувствую, что правильно поняла комбинаторы. :)

Спасибо за помощь:)

...