【发布时间】:2020-07-11 00:23:02
【问题描述】:
我使用组合器来计算数字列表的平均值...
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 组合器,但我认为不是这样吗?对吗?
它是一个“命名”的组合子吗?如果有,你知道是哪一个吗?
来自 cmets
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
【问题讨论】:
-
github.com/fantasyland/fantasy-birds/blob/master/… 它看起来确实像黑鸟组合器......也许
-
@evolutionxbox 你能帮我解构它吗,因为我已经看了很长时间了,我看不出它是如何适应这种模式的。哈哈 :D
blackbird :: (c -> d) -> (a -> b -> c) -> a -> b -> d -
x(数组)分别被传递给sum和length。然后将这些输出传递到收敛函数div。这给了你最终的输出。所以我更确信是黑鸟。 -
就是这样!考虑为您的问题添加答案?你找到了;)
-
黑鸟将一个有 2 个输入的函数通过管道传递给一个有 1 个输入的函数。所以你的组合器不是黑鸟。我建议您查看this video,了解有关黑鸟和一般组合器的更多信息。