Chinaunix

标题: Perl6 新特性之元操作符之 reduce 操作符 [打印本页]

作者: flw    时间: 2010-08-02 11:48
标题: Perl6 新特性之元操作符之 reduce 操作符
Perl6 引入了许多函数式编程的概念,
其中“元操作符(meta-operator)”应该是最有 FP  特色的。

什么是元操作符?
元操作符就是说,对一个运算符,进行某种变换,得到一个新的运算符,这个新的运算符和之前的运算符的参数形式、计算结果都不一样(可以说是面目全非)。

因为它是针对运算符的运算,因此称为元操作符符。

举个大家都熟悉的例子:
在很多语言里面,都支持 += 这样的运算符,比如在 Perl5 中:

$a += 2;     等同于       $a = $a + 2;

这里就好比是对加法运算进行了一次变换,变换出了 += 这个新的运算符。
类似的还有 -= *= 等等。

但是,大多数语言中,这样的运算符只有有限的几个,而且虽然它们被设计成了这个样子,
但这只是为了便于程序员记忆,本质上它们和别的运算符都是一样的,都是编译器实现的,不是程序员实现的。

Perl6 中就不同了,你可以随便搞个运算符,然后后面跟个等号,就可以变成一个新的运算符,举个例子:

> my $a = 0
0
> $a or= 2
2
>

以上例子在 Rakudo star 中运行通过,大家可以自行举一反三。

=========== 好,以上只是个小小的背景介绍,下面才是正文 ===========

下面介绍一个有些人以前可能没有听说过的操作,叫做 reduce 操作(学过 Python 的人可能了解过),
这个操作的含义是说,把一个列表,用一个运算符折叠起来,最简单的例子,比如:

1..100 这个列表,用加法运算折叠起来,结果就是 1+2+3+4.......+100

这个逻辑在不支持 reduce 的语言中,可以用循环来实现。
有些语言的 library 里面也提供这样的操作,比如 Perl5:

use List::Util qw(reduce);

my $sum = reduce { $a + $b } 1..100;      # 得到 5050

那么,Perl6 的 reduce 元操作符是什么样的呢?
还是看下面的例子吧:

> [+] 1..100
5050
>

没错,就是在运算符的外面加一层方括号,就变成了 reduce 运算。
而这个方括号就是 reduce 元运算符,非常好用,非常方便。

大家听明白了没有?

听明白了的人举一下手,没听明白的人重看一遍。
作者: yybmsrs    时间: 2010-08-02 11:55
听明白了
作者: wfnh    时间: 2010-08-02 12:44
明白了··好强大·
作者: wfnh    时间: 2010-08-02 12:44
希望flw老大··继续发一些关于perl6的好文章·
作者: ynchnluiti    时间: 2010-08-02 13:10

作者: gilet    时间: 2010-08-02 17:20


作者: toniz    时间: 2010-08-03 09:19

作者: cobrawgl    时间: 2010-08-03 20:36
{:3_182:}
作者: ttcn_cu    时间: 2010-08-04 10:10
刚发现 reduce 真是个好东西
作者: lvlfforever    时间: 2010-08-04 17:05
懂了
作者: casper0511    时间: 2010-08-04 17:11
{:2_167:}{:2_168:}
作者: argstormsky    时间: 2010-08-04 19:36
perl6还是在加语法糖么
作者: 2gua    时间: 2010-08-05 09:25
Perl就是有创意。
作者: 兰花仙子    时间: 2010-08-05 10:19
Perl就是有创意。
2gua 发表于 2010-08-05 09:25



    你应该知道的,ruby里早有啦~~

irb(main):001:0> (1..100).inject{|sum, item| sum += item}
=> 5050

作者: 2gua    时间: 2010-08-06 06:36
你应该知道的,ruby里早有啦~~
兰花仙子 发表于 2010-08-05 10:19



    呃,俺只想赞美一下Perl,连这都被你发现了...
作者: DQP    时间: 2010-08-06 08:53
你应该知道的,ruby里早有啦~~
兰花仙子 发表于 2010-08-05 10:19



reduce 本身不是什么新鲜东西。 perl5 中也有 (List::Util).  即使没有的话自己写一个也不难。
有趣的是Reduction Operators 这种形式。
作者: skyvoice    时间: 2010-08-06 17:20
matlab or octave 一句话 sum(1:100) 矢量 操作更快
作者: dy8h    时间: 2010-08-08 02:00
or= 看样子不错,哈哈~
作者: cinanine    时间: 2011-05-12 14:06



举一下手


听明白了
作者: txh_zyy    时间: 2011-05-13 17:24
啊哈,明白了~~~
作者: buaaspy    时间: 2011-05-13 20:15
LISP Perl
作者: 2gua    时间: 2011-05-13 21:24
flw,现在对6,还看好?
作者: kelvenchi    时间: 2013-12-07 13:27
有点象 lisp




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2