函数式编程的几个特征

函数式编程

函数式编程属于声明式编程的一种,将计算描述为数学函数的求值,但是并没有准确的定义,只是一系列理念,并不需要严格准守,可以理解为函数式编程把程序看做是数学函数,输入的是自变量,输出因变量,通过表达式完成计算。现在越来越多的命令式语言支持部分的函数式编程特性,比如java8中的lambda。

lambda表达式

Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数

python中的lambda表达式

foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
print map(lambda x: x * 2 + 10, foo)
#[14, 46, 28, 54, 44, 58, 26, 34, 64]

javascript

var foo = [2, 18, 9, 22, 17, 24, 8, 12, 27];
foo.map((v) = > {
  return x * 2;
})
//[14, 46, 28, 54, 44, 58, 26, 34, 64]

erlang

Foo = [2, 18, 9, 22, 17, 24, 8, 12, 27],
lists:map(fun(X) -> X *2 end,Foo).

java8

List foo = Arrays.asList(2, 18, 9, 22, 17, 24, 8, 12, 27);
foo.stream().map((cost) -> cost * 2);

使用lambda表达式的好处是减少了代码量,而且使程序更加灵活易读,若不使用lambda表达式,对于以上代码,若需要将每个集合里的数变为原来的3倍,那么必须重新编写一套新的代码,使用lambda表达式可以大大增加代码的灵活性。

高阶函数

在函数式编程中,函数作为一等公民,就是说函数的行为和普通变量没有区别,可以作为函数参数进行传递,也可以在函数内部声明一个函数,那么外层的函数就被称作高阶函数。

javascript

function maps(l,cb){
  //函数内部定义函数
  let func1 = () =>{console.log("function test1")};
  function func2(){
    console.log("function test2");
  }
  
  let temp = [];  
  for(let i = 0;i<l.length;i++){
    temp.push(cb(l[i]));  
  }
  return temp;
}

let l = [1,2,3,4,5];
//函数作为参数传递
let re = maps(l,(v) => {
  return v * 2;
})
console.log(re);
// re : [2,4,6,8,10]

go

func maps(l []int,cb func(v int) int){
    for i:=0;i<len(l);i++{
        l[i] = cb(l[i])
    }
}

list := []int{1,2,3,4}
maps(list, func(v int) int {
    return v *2
})
// [2,4,6,8]

柯里化

柯里化(英语:Currying),把接受多个参数的函数变换成接受一个单一参数的函数,返回接受余下的参数并且返回结果的新函数。

比如说在javascript中

//不使用柯里化
function add(a,b){
  return a+b;
}
add(1,2);

//currying
function add(a){
  return (b) =>{
     return a+b;
  }
}
add(1)(2)

柯里化的好处是减少了函数的参数个数,并且模块化了每步计算,与设计模式中的适配器模式(将一个接口转换为另一个接口)类似,并且柯里化的应用之一"惰性求值"也是函数式编程的一个重要特性

一次赋值

函数式编程要求所有的变量都是常量(这里所用的变量这个词并不准确,只是为了便于理解),erlang是其中的典型语言,虽然许多语言支持部分函数式编程的特性,但是并不要求变量必须是常量。这样的特性提高了编程的复杂度,但是使代码没有副作用,并且带来了很大的一个好处,那就是大大简化了并发编程。就用java来说吧,java中最常用的并发模式是共享内存模型,依赖于线程与锁,若代码编写不当,会发生死锁和竞争条件,并且随着线程数的增加,会占用大量的系统资源。在函数式编程中,因为都是常量,所以根本就不用考虑死锁等情况。为什么说一次赋值提高了编程的复杂度,既然所有变量都是常量,那么我们没办法更改一个变量的值,循环的意义也就不大,所以haskell与erlang中使用递归代替了循环。

命令式语言中遍历一个数组
c语言

int l[5] = {1,2,3,4,5};
int i = 0;
for(;i<5;i++)
{
  //some action
}

erlang

loop([]) -> [];
loop([H|T]) ->
  % some action with   H
  loop(T).

test() ->
  loop([1,2,3,4,5]).

%在erlang终端中执行test函数

闭包

闭包是指那些能够访问独立(自由)变量的函数 (变量在本地使用,但定义在一个封闭的作用域中)。换句话说,这些函数可以“记忆”它被创建时候的环境。可以看stackoverflow上的大佬怎么回答的。

javascript代码

function sayHello() {
    let i = 0;
    return () =>{
        return i ++;
    }
}
let t = sayHello();
console.log(t(),t(),t());//0,1,2
//闭包会保持其对外部变量的引用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容