【问题标题】:What is this combinator?这个组合器是什么?
【发布时间】: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 被传递给创建bc 的两个函数。然后将它们传递给返回 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(数组)分别被传递给sumlength。然后将这些输出传递到收敛函数div。这给了你最终的输出。所以我更确信是黑鸟。
  • 就是这样!考虑为您的问题添加答案?你找到了;)
  • 黑鸟将一个有 2 个输入的函数通过管道传递给一个有 1 个输入的函数。所以你的组合器不是黑鸟。我建议您查看this video,了解有关黑鸟和一般组合器的更多信息。

标签: javascript combinators


【解决方案1】:

感谢@evolutionxbox 提供的有用链接,我能够找到定义为...的Starling_ 组合子...

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

就我而言...

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

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

感谢您的帮助:)

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 2022-08-16
    相关资源
    最近更新 更多