这个组合器是什么?

What is this combinator?

我使用了组合器来计算一列数字的平均值...

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 组合器,但我不认为是这样吗?对吗?

它是 "named" 组合器吗?如果有,你知道是哪一个吗?

来自评论

黑鸟的定义如下... blackbird :: (c -> d) -> (a -> b -> c) -> a -> b -> d

但是,我认为我的功能就像...

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

即它 returns 一个接受 a 和 returns 一个 d 的函数。 a 被传递到创建 bc 的两个函数中。然后将它们传递到 returns d.

的函数中

经过以上评论

我找到了!从 @evolutionxbox link 我找到了 Starling_ 组合器...

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

这正是我上面写的:D

感谢@evolutionxbox 的帮助link,我能够找到定义为...

Starling_ 组合子

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

就我而言...

  • a -> b 是我的 sum 函数,它接受数组和 returns 一个数字。
  • a -> c 是我的 length 函数,它接受数组和 return 一个数字。
  • b -> c -> d 是我的 div 函数,它接受两个数字并将它们相除。

这是我第一次觉得我现在已经正确理解了组合器。 :)

感谢您的帮助:)