函数式编程这一年(节译)

本文是翻译,版权归原作者所有


自从我首次接触函数式编程的概念,已经有一年了。说它改变了我的生活,是一个不公平的客气说法。这是关于那趟旅行的写照。

个人简介

我8岁编程,到现在有26年了。我开始用BASIC和不同类型的汇编,然后转到了C,C++,PHP和Perl(是在不同的时期),Java,JavaScript和Ruby。基本上:大多时间是在上班时间,绝对没有接触到函数式编程的概念或语言。我过去认为函数式编程仅仅意味着递归函数。我真的是两眼一抹黑地进来了。

起初:Scala

去年,我渴望Java在速度和静态检查(注意:不是“类型”)有着Ruby的简洁和灵活。我遇到了Scala,浏览了一会儿,受到了触动。我买了一份《Scala For The Impatient》,只是当做家常便饭。我用2-3天通读了一遍,记下每个有用的地方,然后开始编程。真是棒极了!起初我只是用Java的方式写代码,少用了一半的代码行数。它是一个非常有效率的Java。

暴露:Haskell

我在Scala社区潜水时,看到一个笑话。有人说“Scala是Haskell的诱导性毒品。”虽说不是作者的本意,我还是觉得有意思。Haskell?它不是某种玩具式的大学语言?一个试验品或某种东东。它甚至还活着?Scala很棒,也很强大,为什么会倒向Haskell?多么好奇呀。难以理解的是,它激怒了我的兴趣,并真正吸引了我。随后我决定查阅资料,是的,它一定还活着,并且非常活跃。我吃惊地发现它编译成机器码(二进制),速度可与C/C++媲美。真的吗?!我像个白痴,但是一年前我还认为它是某种解释性的方程解算器。不单单是我一个人愚昧,悲催呀;去年一次午餐和几个伙伴谈到时,一个朋友怀疑地爆发出了笑声,“Haskell?”就好像我在试图告诉他,我的洗碗机有一个印象深刻的静态类型系统。意识到我处于黑暗之中,还有很多人也在黑暗之中,让我感到悲伤。Haskell是多么棒呀!的确是诱导性毒品的预言,我现在把Haskell看做是使用Scala的进阶。但是让我们言归正传。

暴露:Scalaz

我也开始看到了围绕一个叫做Scalaz的类库的持续讨论。出于好奇,我想看看代码内部的情况,可是根本理解不了。我看到了形如Blah[F[], A, B]的类,带有参数的、名字晦涩的方法形如G[], A → C, F[X → G[Y]],还有形如F.boo_(f(x))(g)(x)的实现,我想“这TM究竟是什么?有用吗?”。我习惯于在域内做属于其目标的工作的方法。这个Scalaz代码对我而言是陌生的,非常神秘。一些表面聪明的人花时间排列这些代号语言,是为了什么?

自从我发现了这个问题的答案之后,我无法想象其带来的好处。根据相关法则,我现在看到的是用于态射(morphism)的函数,而不是特定域意义的方法。简单:改变类型的模型或类型。不要提任何种类的问题域;适用于所有问题域!在去年非常惊奇地看到这是多么地适用。这种抽象是多产的,它就在你的代码里,伪装着,与你的业务代码纠缠在一起。不知道这种抽象(意识到类型组件级别的抽象的确是可能的),你注定要一直重新发明轮子、甚至意识不到它:标识并使用这些抽象,你的代码将变得更加可复用、简单、可读、灵活和可测试。当你意识到这一点时,是激动人心的。

函数式编程:基础

既然我接触了函数式编程,我开始积极地学习它。最初我学习了引用透明(Referential transparency)【注1】,纯粹的和副作用。我对坚持这种原则的可行性点头同意,但有保留意见,因此刚开始我没有被说服。确切地说,我犹豫了。我或许对含糊的句子混入“真实世界”感到愧疚。接下来就是不变性了。以前我习惯笃信地使用Java里的final、C++里的常量,如今函数式编程主张数据不变性。不仅仅是坚定地主张,而且提供了真正的、优雅的解决方法,针对你遇到的使用完全不变的数据结构的问题。哇!有了不变性,模块化,最终它吸引住了我。

接下来要主张更多的表达式类型和ADT。理论上也是吸引人的,我再次怀疑其灵活性。一旦我实验性地将其应用到我项目的某些地方,我很吃惊地看到它到现在还在良好地运转着。那变成了代数上通向思考代码/类型的大门,它导致了……

函数式编程:数学

我上学的时候就热爱数学,总是觉得它容易。阅读函数式编程资料,我开始遇到大量数学,起初我想“太好了!我数学不错!”但是后来,试着搞懂某些函数式编程的数学东东,我发现自己花了好几个小时一个挨一个链接地点击,才知道我搞不懂,大多数情况,我甚至仍然不能明白标记。真让我气馁,甚至失望,多次失去了动力。

好消息是你需要的每样东西就在那里;只是你不得不准备学习比你认为需要的更多的东西。我坚持住了,我不再把它看做一个讨厌的桥梁,开始做为一个本身有趣的主题,很快我再次搞懂了。当你学习的时候,它开启了新的大门。

例子:我保持一个浏览器tab开启了3个月,因为我没有弄明白。花费了数月(关于Yoneda引理),然后困惑,然后快理解背景了,不管它是什么,又把我扔在了一边。一旦我知道了背景信息的最后一块,我的理解从只有5%增长到了100%。这是一个很棒的感受。

(译者注:后半部分略去)

译文:函数式编程这一年(节译) 》| 腊八粥