代码之家  ›  专栏  ›  技术社区  ›  Sean

逗号运算符上的三角形减法如何知道生成所有列表的列表?

  •  10
  • Sean  · 技术社区  · 6 年前

    在Perl6中,对逗号运算符进行三角形缩减会生成一个列表列表,每个列表都从输入列表中添加一个连续的元素:

    > [\,] 1..5
    ((1) (1 2) (1 2 3) (1 2 3 4) (1 2 3 4 5))
    

    非常好!但是最近我想知道它是如何工作的。

    如果 op 是一个任意的运算符, [op] @list 应该和 @list[0] op @list[1] op ... op @list[*-1] . 据我所知, [\op] 然后应该是所有中间值的列表。但这似乎意味着 [\op] @list 应评估为 (@list[0], @list[0] op @list[1], @list[0] op @list[1] op @list[2], ...) . 在我原来的情况下 运算 , ,则输出列表的第一个元素应该只是 @list[0] 但是它不是;它是一个单件清单 (@list[0],) .

    原始的三角形约简如何知道使其输出的第一个元素成为单例列表?

    如果我编写自己的列表构建例程,它会像我预期的那样工作:

    > sub foo { |$^a, $^b }
    sub foo ($a, $b) { #`(Sub|93971926296448) ... }
    > [[&foo]] 1..5
    (1 2 3 4 5)
    > [\[&foo]] 1..5
    (1 (1 2) (1 2 3) (1 2 3 4) (1 2 3 4 5))
    
    2 回复  |  直到 6 年前
    推荐文章