开发工具:
文件大小: 2mb
下载次数: 0
上传时间: 2019-07-03
详细说明:什么是函数式编程,相信有会有兴趣了解。纯函数有什么好处?什么是柯里化?这里有答案3
Introduction
This is the Simplified Chinese translation of mostly-adequate-guide, thank
Professor Franklin Risby for his great work
关于本书
这本书的主题是函数范式( functional paradigm),我们将使用 JavaScript这个世
界上最流行的函数式编程语言来讲逃这一主题。有人可能会觉得选择 JavaScript并
不明智,因为当前的主流观点认为它是一门命令式( mperative)的语言,并不适
合用来讲函数式。但我认为,这是学习函数式编程的最好方式,因为
你很有可能在日常工作中使用它
这让你有机会在实际的编程过程中学以致用,而不是在空闲时间用一门深奧的
函数式编程语言做一些玩具性质的项目。
●你不必从头学起就能开始编写程序
在纯函数式编程语言中’你必须使用 monad才能打印变量或者读取DOM节
点。 JavaScript则简单得多,可以作弊走捷径’因为毕竟我们的目的是学写纯
函数式代码° JavaScript也更容易入门,因为它是一门混合范式的语言’你随
时可以在感觉吃力的时候回退到原有的编程习惯上去。
这门语言完全有能力书写高级的函数式代码
只需借助一到两个微型类库· JavaScript就能模拟 Scala或Hask础这类语言
的全部特性。虽然面向对象编程( object-oriented programing)主导着业界,
但很明显这种范式在 Java script里非常笨拙’用起来就像在高逸公路上露营或
者穿着橡胶套鞋跳踢踏舞一样。我们不得不到处使用bind以免this不
知不觉地变了’语言里没有类可以用(目前还没有),我们还发明了各种变通
方法来应对忘记调用new关键字后的怪异行为,私有成员只能通过闭包
( closure)才能实现,等等。对大多数人来说,函数式编程看起来更加自然
以上说明’强类型的函数式语言毫无疑问将会成为本书所示范式的最佳试验场。
JavaScript是我们学习这种范式的一种手段,将它应用于什么地方则完全取决于你
自己。幸运的是’所有的接口都是数学的,因而也是普适的。最终你会发现你习惯
了 swift、 scala、 haske川和 purescript以及其他各种数学偏向的语言。
Gitbook(更好的阔读体验)
Introduction
在线阅读
下载EPUB
·下载Mobi( Kindle)
目录
第1部分
第1章:我们在做什么?
o介绍
O一个简单例子
第2章:一等公民的函数
o快速概览
o为何钟爱一等公民
第3章:纯函数的好处
o再次强调“纯”
o副作用可能包括
o八年级数学
O追求“纯”的理由
o总结
·第4章:柯里化(cury)
不可或缺的cury
o不仅仅是双关语/咖喱
o总结
·第5章:代码组合( compose)
o函数饲养
o poIntTree
o debug
o范畴学
总结
●第6章:示例应用
o声明式代码
o一个函数式的fckr
o有原则的重构
总结
Introduction
第2部分
第7章: Hindley- Milner类型签名
o初识类型
o神秘的传奇故事
o缩小可能性范围
o自由定理
结
第8章:特百惠
o强大的容器
o第一个 functor
o薛定谔的 Maybe
o“纯”错误处理
o王老先生有作用
o异步任务
o一点理论
o总结
第9章: Monad
o pointed functor
o混合比喻
o chain函数
o理论
o总结
第10章: Applicative Functor
o应用 applicative functor
o瓶中之船
o协调与激励
lift
o免费开瓶器
o定律
总结
未来计划
第1部分是基础知识。这是初版草稿’所以我会及时更正发现的的错误。欢迎
Introduction
提供帮助!
·第2部分讲遊类型类( type class),比如 functor和 monad,最后会讲到到
traversable o我希望能塞进来一些 monad transformer相关的知识,再写一个
纯函数的应用。
第3部分将开始游走于编程实践与学院学究之冋。我们将学习 comonad、f-
algebra丶 free monad yoneda以及其他一些范畴学概念。
第1章:我们在做什么?
第1章:我们在做什么?
介绍
你好’我是 Franklin Risby教授·很高兴认识你。接下来我们将共度一段时光了,
因为我要教你一些函数式编程的知识。好了,关于我就介绍到这里,你怎么样?我
布你已经熟悉 JavaScript语言了,关于面向对象也有一点点的经验了,而且自认
为是一个合格的程序员。希犂你没有昆虫学博士学位也能找到并杀死一些臭虫
(bug
我并不假设你辶前有任何舀数式编程相关的知识——我们都知道假设的后果是什么
(译者注:此处原文是 we both know what happens when you assume",源自一
句名言" When you assume you make an ass of u and me”,意思是“让两人都难
堪”)。但我猜想你在使用可变状态( mutable state)、无限制副作用
( unrestricted side effects)和无原则设计( unprincipled design)的过程中已经遇
到过一些麻烦。好了,介绍到此为止,我们进入正题
本章的目的是让你对函数式编程的目的有一个初步认识,对一个程序之所以是函数
式程序的原因有一定了解’要不然就会像无头苍蝇一样,不问青红息白地避免使用
对象——这等于是在做无用功。写代码需要遵循一定的原则’就像水流湍急的吋候
你需要天文罗盘来指引一样。
现在已经有一些通用的编程原则了’各种缩写词带领我们在编程的黑暗隧道里前
行:DRY(不要重复自己, don t repeat yourself),高内聚低耦合( loose
coupling high cohesion), YAGNI(你不会用到它的· ya ain 't gonna need it)
最小意外原则( Principle of least surprise)单一贲任( single responsibility)等
等
我当然不会啰里八嗦地把这些年我听到的原则都列举出来,你知道重点就行。重点
是这些原则同样适用于函数式编程’只不过它们与本书的主题不十分相关。在我
深入主题之前’我想先通过本章給你这样一种感觉’即你在敲键盘的时候内心就能
强烈感受到的那种函数式的氛围。
个简单例子
第1章:我们在做什么?
我们从一个愚蠢的例子开始。下面是一个海鸥程序,鸟群合并则变成了一个更大的
鸟群’繁殖则増加了鸟群的数量’増加的数量就是它们繁殖岀来的海鸥的数量。注
意这个程序并不是面向对象的良好实践’它只是强调当前这种变量赋值方式的一些
弊端。
var Flock function(n)i
this, seagulls = n;
Flock. prototype conjoin function (other)i
this seagulls + other seagulls;
return this
Flock. prototype breed function (other)i
this seagulls this seagulls other seagulls;
return thisi
var flock_a new Flock(4)
var flock_b= new Flock(2)
var flock_c new Flock(o)
var result flock_a conjoin(flock_c).breed(flock_b). conjoin(flo
ck a breed(flock_b)). seagulls;
//=>32
我相信没人会写这样糟糕透顶的程序。代码的内部可变状态井常难以追踪,而且
最终的答案还是错的!正确答案是16·但是因为f1ock_a在运算过程中永久
地改变了·所以得出了锆误的结釆。这是「T部门混乱的表现,非常粗暴的计算方
式
如杲你看不懂这个程序’没关系,我也看不懂。重点是状态和可变值井常难以追
踪’即便是在这么小的一个程序中也不例外。
我们试试另一种更函数式的写法
第1章:我们在做什么?
var conjoin function(flock_x, flock_y)i return flock_x floc
var breed function(flock_x, flock yi return flock_x flock
var flock a= 4:
var flock b=2
var flock=0
var result conjoin(breed(flock_b, conjoin(flock_a, flock_c))
breed(flock_a, flock_b))
//=>16
很好’这次我们得到了正确的答案’而且少写了很多代码。不过函数嵌套有点让人
费解..(我们会在第5章解决这个问题)。这种写法也更优雅’不过代码肯定是越
直白越好’所以如果我们再深入挖掘’看看这段代码究竟做了什么事,我们会发
现,它不过是在进行简单的加( ConJoin)和乘( breed)运算而已
代码中的两个函数除了函数名有些特殊’其他没有任何难以理解的地方。我们把它
们重命名一下,看看它们的真面目
var add function (x, y)t return x+ yji
var multiply function(x, y)i return x *y ji
var flock a=4
var flock b=2:
var flock c= o
var result add(multiply (flockb, add(flock_a, flock__c), multi
py(f⊥ocka, flock b));
//=>16
这么一来’你会发现我们不过是在运用古人早已获得的知识
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.