【问题标题】:[] reduce with anonymous function in Perl 6[] 在 Perl 6 中使用匿名函数减少
【发布时间】:2018-05-06 21:42:49
【问题描述】:

我们可以将reduce 与带有两个参数的sub 一起使用,并将其放在双括号中:

> sub mysum { $^a + $^b }
> [[&mysum]] 1,3,5
9

但是如果我们想使用匿名函数呢?

以下两种变体都会产生编译错误:

> [[&{ $^a + $^b }]] 1,3,5
> [[{ $^a + $^b }]] 1,3,5

【问题讨论】:

    标签: syntax functional-programming raku


    【解决方案1】:

    在reduce 形式中不允许有任何空格。

    > [[&({$^a+$^b})]] 1, 3, 5
    9
    

    这样更明显的是它是一个reduce,而不是一个数组声明。

    > [ { $^a + $^b }, { $^a * $^b } ].pick.(3,5)
    8 | 15
    

    [[…]]只是允许任何函数用作中缀运算符的扩展。

    请注意,您必须在此功能中使用 &(…),而不是谈论命名函数 &foo 或已经存在的中缀运算符。

    > 3 [&( { $^a + $^b } )] 5
    8
    

    这是使用[…]Z= 等元运算符括起来的一种扩展

    > @a [Z[[+]=]] 1..5
    > @a Z[[+]=] 1..5
    > @a Z[+=] 1..5
    > @a Z+= 1..5
    

    【讨论】:

      【解决方案2】:

      不知道为什么这不起作用。但总有:

      say reduce { $^a + $^b }, 1,3,5 # 9
      

      我猜你知道,但这就是我今晚的全部内容。 :)

      我现在把我的评论移到这里,并在我睡觉前把它扩大了一点。

      TTIAR 错误意味着它无法将 reduce 解析为 reduce。所以我决定快速浏览the Perl 6 grammar

      我搜索了“reduce”并很快推断出它一定是无法匹配this regex

      虽然该正则表达式可能只有 20 行左右,而且我知道其中的大部分构造,但它显然不是微不足道的。我想有一种方法可以将Grammar::Debugger 和/或其他一些语法调试工具与 Perl 6 语法一起使用,但我不知道。同时,你现在一定是个正则表达式高手,所以你告诉我:为什么不匹配? :)

      更新

      以布拉德对您问题的回答为指导,我的问题的答案立即显而易见。 first line of the regex proper(在两个变量声明之后)直接对应于布拉德透露的“无空格”规则:

      <?before '['\S+']'>
      

      这是一个断言,即正则表达式引擎位于[...] 形式的字符串之前,其中... 是一个或多个非空格字符。 (\s 表示空格,\S 表示非空格。)

      (当然,如果没有布拉德的回答,我会完全困惑为什么这个非空格规则存在。)

      【讨论】:

      • 谢谢!是的,我知道,问题是关于 [] 语法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 2019-04-04
      • 1970-01-01
      相关资源
      最近更新 更多