函数式编程(Functional Programming),一看这个词,简直就是学院派的典范。

以至于从 Lisp 的创世,到 Scheme、Haskell、Clean、Erlang、Miranda、Scala、LOGO、Clojure、Mathematica 甚至 R,它们一出生就站在了鄙视链的顶端,尤其是非纯函数式的 Lisp 老祖和纯函数式的集大成者 Haskell。就如段子里说的,一群程序员自我介绍,当听到“我是写 Lisp 的…”这一句,所有人的注意力都会被吸引。简直是众多程序员想要装逼的顶峰,可见一斑。

学院派的语言方法似乎只有大学研究里才会使用,但随着技术和时代的发展,JavaScript,这种典型的多范式编程语言,也由面向对象为绝对主导逐渐纳入各种函数式编程的特性,这两年的 React、TypeScript、Immutable、underscore、Elm 等等,纷纷加入了函数式编程的大潮。所以这期周刊,我们就重点引入 JavaScript 的函数式编程,浅入浅出,一窥函数式编程的思想,可能让你对编程语言的理解更加融会贯通一些。

浅入

1. 什么是函数式编程?

JavaScript 函数式编程(一) 丨 JavaScript 函数式编程(二) // 王伟嘉

这两篇将 JS 函数式编程的典型特性“1. 纯函数概念,函数柯里化和函数的组合;2. 容器和 Functor,Maybe,Monad,Either 以及 IO”由浅及深,一个个地做了介绍,非常不错的入门文章。

「所谓的纯函数就是,对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环境的状态。」

2. 函数式思想的理解

《JavaScript 函数式编程》读书笔记 // homker

这是作者对《JavaScript 函数式编程》的理解,JS 为什么要用函数式编程(数据和行为的关系、专注于过程本身),如何使用函数式编程(一等公民、纯函数、可组合、高阶函数、基于流的编程),可以让你更深入地理解 JS 大量引入函数式方法的思想。

译丨JavaScript 与函数式编程 // 文蔺

现在,来进行更细节的分析和理解 展现另一面的函数式编程思维:强调将程序状态变化(即副作用 side effect)的次数减到最小,鼓励使用不可变数据(immutable data)和纯函数(pure functions)(“纯”意味着没有副作用的),更倾向于使用声明式的风格(让代码更干净,可读性更强,推理起来更简单)。

3. 特性各个了解

在下函数式编程有何贵干 // 力谱宿云

示例代码清晰,简单明了,让你快速了解 FP 的诸多特性,接下来,再一一分解。

  • 译丨JavaScript 中的不可变性(Immutability) // leftstick
  • 译丨浅入浅出 Monads // leftstick
  • JavaScript 也玩私人订制——玩转函数柯里化 // 条件状语从句
  • 函数式编程中局部应用(Partial Application)和局部套用(Currying)的区别 // n͛i͛g͛h͛t͛i͛r͛e͛
  • 函数式编程之柯里化和组合详解 // 橘子小睿

前面提到的纯函数、函数柯里化、函数的组合、偏函数、容器、Functor、Monad、IO 等等,这里都有分别的详细讲解。

浅出

4. 各 JS 方言都有了哪些实践?

译丨函数式 TypeScript // 文蔺

「谈到函数式编程时,可能常被提到的是机制、方法,而不是核心原则。但从根本上来说,函数式编程就是关于如使用通用的可复用函数进行组合编程。」——作者在重构 TypeScript 代码时使用函数式的一些思考

  • 函数式编程——入门笔记与 React 实践 // kpaxqin
  • Immutable 详解及 React 中实践 // Cam
  • Redux 入坑进阶 - 源码解析 // ecmadao

React.js 的代码中包含了大量函数式思想,比如 Immutable,比如 Redux 的柯里化函数以及代码组合,不妨来看看。

  • Elm 入门实践系列 by @kpaxqin:(一)基础篇 丨 (二)类型篇 丨 (三)进阶篇
  • 笨办法学函数式编程:Elm 初体验 // Integ

如果你打算开始函数式编程,晦涩的 Monad/Functor 们可能也需要动手写点东西来熟悉,而随着整个 React 社区往函数式方向发展,Elm 作为前端函数式编程的先驱和风向标,毫无疑问是值得去学习和借鉴的。这两个系列,一步步地带你了解如何使用 Elm 构建应用。

5. 函数式的思想在其他语言中的体现

函数式编程在实际生产中发挥着巨大的作用,越来越多的语言加入闭包,匿名函数等非常典型的函数式编程的特性,从某种程度上来讲,函数式编程正在逐步“同化”命令式编程。

  • Swift - Swift 中的柯里化 Currying:Swift 柯里化特性的简单了解

  • Scala - Scala 类型参数:多范式语言的典范

  • Java - Java8 Lambda 本质论 丨 正交设计 丨 Write Lean Programs:Java 的设计模式、λ 演算、设计思想

  • Scheme - 如何实现一个没有名字的递归函数:一个递归引发的思考 - “当函数在还没有定义完整时,为什么能够直接调用的呢?”

6. 补充阅读

  • JavaScript 函数式真正的浅析
  • JavaScript 数组分组的实现
  • Immutable.js 初识
  • js 函数式编程之函数柯里化
  • 合理的使用纯函数式编程
  • 浅谈函数式编程和函数响应式编程
  • 正交设计,OO 与 SOLID

(本期完)


# SegmentFault 技术周刊 #

「技术周刊」是社区特别推出的技术内容系列,一周一主题。周刊筛选的每篇内容,是作者的独到见解,踩坑总结和经验分享。

每周二更新,欢迎「关注」或者「订阅」。大家也可以在评论处留言自己感兴趣的主题,推荐主题相关的优秀文章。

转载于:https://my.oschina.net/SegmentFault/blog/809453

SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程 1相关推荐

  1. SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程

    函数式编程(Functional Programming),一看这个词,简直就是学院派的典范. 以至于从 Lisp 的创世,到 Scheme.Haskell.Clean.Erlang.Miranda. ...

  2. SegmentFault 技术周刊 Vol.21 - 程序人生(二):2016 这一年

    在第 18 期社区周刊<程序人生>1 中,我们汇总图灵访谈.SegmentFault 内部程序员访谈.社区开发者的编程之路和工具利器等,分享 2016 这一年里,社区开发者们的日常.其中提 ...

  3. SegmentFault 技术周刊 Vol.4 - 这份 Android 有点甜

    2016 年 8 月,Android 7.0 "Nougat"(牛轧糖)正式发布,那么问题来了,你 Marshmallow 了么(¬ -̮ ¬) Cupcake.Donut.Gin ...

  4. SegmentFault 技术周刊 Vol.7 - iOS丨好好学习,从娃抓起~

    我有一程序员朋友阿温,92 年,高个子,体型偏瘦,平时不善言辞,比较低调.最近,阿温家小娃出生,让他当了一回公司的热议人物. 事情是这样的,那会儿大家都还在睡午觉,只听阿温一声猝不及防的喊声,接下来便 ...

  5. SegmentFault 技术周刊 Vol.17 - 听说你还没用上 AngularJS

    如何在网页上构建动态应用,通常的解决方案是使用类库和框架,来弥补原生 JS 和 HTML 的不足,实现具体的应用逻辑,如典型的 jQuery.knockout.js 等.而 Google 则直接尝试从 ...

  6. SegmentFault 技术周刊 Vol.30 - 学习 Python 来做一些神奇好玩的事情吧

    前言 开始之前,我们先来看这样一个提问: python初学者,请教python学习路径 相信看完 @X_AirDu 的回答我们已经对 Python 有了一个大概的了解.那接下来就让我们更深入的了解 P ...

  7. 技术周刊 Vol.40 - 来学习一门新的编程语言吧!

    新的一年不知不觉已经到来了,总结过去的 2017,相信小伙们一定有很多收获和感悟,那对于刚刚到来的 2018,有什么期待和规划呢?不防就来学习一门新的语言吧,进一步提高编程技能,扩宽自己的知识领域.希 ...

  8. 处理中文乱码_浅入深出:一次提问引发的深思,从此再也不怕“乱码”问题

    这是恋习Python之浅入深出系列第3篇原创首发文章 作者|丁彦军 来源|恋习Python(ID:sldata2017) 转载请联系授权(微信ID:2394608316) 近日,有位粉丝向我请教,在爬 ...

  9. 蒲公英 · JELLY技术周刊 Vol.03

    蒲公英 · JELLY技术周刊 Vol.03 「蒲公英」期刊全新升级--JELLY技术周刊!深度挖掘业界热点动态,来自团队大咖的专业点评,带你深入了解团队研究的技术方向. 登高远眺 天高地迥,觉宇宙之 ...

最新文章

  1. Paxos的工程实践
  2. dealloc时取weakself引起崩溃
  3. Statues(三维bfs)
  4. HALCON示例程序resistor.hdev通过不同焦距图像提取深度信息
  5. 常用技巧 —— 位运算 —— 位运算的应用
  6. dj电商-需求分析开始-静态资源-用户模块
  7. dhcp软件_tp-link无线路由器软件如何升级【教程图解】
  8. 四天学会Mybatis
  9. php 处理tiff,TIFF图像文件(五):LZW的PHP应用
  10. [转载]Informix平安特征庇护数据的详细方法
  11. android第十二步Pull解析器解析和生成XML内容
  12. 10个值得关注的python博客(转)
  13. 将java类的泛型集合转换成json对象
  14. Keil5安装NXP核心LPX2000系列 出现err:Cannot read project file异常,err :出现闪退异常
  15. 油猴插件官网下载及Userscript+安装教程
  16. android屏幕有残影,如何预防手机烧屏 防止手机屏幕出现残影教程分享
  17. SVM 超平面计算例题
  18. win10动态壁纸设置
  19. 述职答辩提问环节一般可以问些什么_答辩时老师一般会提问哪些?
  20. git 拉取代码时提示:would clobber existing tag

热门文章

  1. PHP打出来的数字和成语,数字成语一到十大全从一到十成语顺口溜
  2. 考试系统随机出题处理逻辑
  3. 【通信原理】思维导图
  4. 力软快速开发框架建设与介绍
  5. stm32 /*CH340串口使用
  6. 第五章 - 分布式定时任务框架ElasticJob之SpringBoot整合SimpleJob作业(实战一)
  7. 帝国CMS7.5仿《完美游戏台》游戏视频网站源码
  8. MySQL安装与Navicat 图形化客户端工具
  9. 2021年中国邮政行业运行情况分析:业务总收入为12642.3亿元,同比增长14.5%[图]
  10. 编写一个简单的C程序