在perl 6中是否有用于例程调用的中缀版本?

时间:2018-04-02 15:58:17

标签: functional-programming perl6

假设我想将一组函数应用于对象数组。像这样:

my $a = sub ($) { $_ * 2 };
my $b = sub ($) { $_ / 2 };

my @funcs = ($a, $b);

my @ops = @funcs.roll(4);

我能做到

say  ^10 ».&» @ops; 

但是.& is a postfix operator;但是>>.可以用于单个函数。使用

say  ^10 Z. @ops; 

.实际上是调用方法的中缀运算符,会产生关于将其误认为连接运算符的错误。我认为我没有任何其他选择。任何的想法?

3 个答案:

答案 0 :(得分:6)

您可以使用&infix:« o » / &infix:« ∘ »运算符,结合lambda / closure工厂。

sub lambda-factory ( +in ) {
  in.map: -> \_ { ->{_} }
}

my @funcs = (
  * * 2,
  * / 2
);

(@funcs X∘ lambda-factory ^10)».()
# (0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5)

(@funcs «∘» lambda-factory ^10)».()
# [0, 0.5, 4, 1.5, 8, 2.5, 12, 3.5, 16, 4.5]

( (|@funcs xx *) Z∘ lambda-factory ^10 )».()
# (0, 0.5, 4, 1.5, 8, 2.5, 12, 3.5, 16, 4.5)

答案 1 :(得分:4)

如果您有定义的值,则可以使用中缀运算符andthen.

    say (^10 »andthen» (* * 2, * / 2).roll(4))

答案 2 :(得分:1)

如果你推出自己的中缀相当于。&你试图创建的构造似乎工作正常。

$ perl6 -e 'my sub infix:<foo> ($a, $b) { $b($a) }; say ^10 Z[foo] (-> $_ { $_*2 }, -> $_ { $_/2 }).roll(4);'
(0 0.5 1 6)