首页 » 开发 » 函数式编程

函数式编程基础

通常for循环承担以下几种独立的任务:

  • 转换或映射(map) - 将数组中每个元素转为另一个元素。
  • 归纳(folds)或化简(reduce) - 将数组元素合并为一个值。
  • 过滤(filter) - 将数组中某些元素抽取出来。

map的例子,如把数组中每个元素的值加1:

var a = [1,2,3];
for(i = 0; i < a.length; ++i) {
    a[i] = a[i] + 1;
}

我们可以定义一个通用函数来做这件事:

function map(f, a) {
    for(i = 0; i < a.length; ++i) {
        a[i] = f(a[i]);
    }
}

map(function(x){return x+1;}, a);
map(function(x){return x*2;}, a);

Haskell里这样写:

a1 = map (+1) a
a2 = map (*2) a

Ruby的一个例子:

["lions", "tigers", "bears"].collect {|item| item.upcase}

reduce的例子,如把数组元素相加或相乘:

function sum(a) {
    var t = 0;
    for(i = 0; i < a.length; ++i) {
        t += a[i];
    }
    return t;
}

function mul(a) {
    var t = 1;
    for(i = 0; i < a.length; ++i) {
        t *= a[i];
    }
    return t;
}

我们同样可以抽象一个函数:

function reduce(f, a, init) {
    var s = init;   // seed
    for(i = 0; i < a.length; ++i) {
        s = f(s, a[i]);
    }
    return s;
}

function sum(a) { return reduce(function(a, b){return a+b;}, a, 0); }
function mul(a) { return reduce(function(a, b){return a*b;}, a, 1); }

Haskell里这样写:

t = foldl (+) 0 a

filter的例子

Ruby的一个例子:提取经理级别的雇员:

emps.select {|e| e.is_manager}

参考

for循环为何可恨?

分享

0