单子是自函子范畴上的一个幺半群
有晕头转向吗?不要担心,我自己也被绕晕了!对于那些已经了解函数式编程的人来说,这些专业术语才有意义,然而对于大部分人而言,它们没有任何意义。
这本书并不打算教你以上那些专业术语的具体含义。如果那正是你想查找的,请继续查阅。事实上,已经有很多从头到尾(正确的方式)介绍函数式编程的书了。如果你在深入学习函数式编程,这些专业术语有很重要的意义,你肯定会对这些专业术语越来越熟悉。
但是本书打算以另一种方式讲解函数式编程。我将从函数式编程的一些基础概念讲起,并尽可能少用晦涩难懂的专业术语。我们将尝试以更实用的方法来探讨函数式编程,而非纯粹的学术角度。毫无疑问,肯定会有专业术语。但是我将会小心谨慎的引入这些术语并解释为何它们如此重要。
可悲的是我并非酷酷的函数式编程俱乐部的一员。我从没有正式学过函数式编程。尽管我有计算机方面的教育背景并对数学有一定了解,但数学符号跟我理解的编程完全是两回事。我从来没写过一行 Scheme、Clojure 或 Haskell 代码,也不是老派的 Lisp 程序员。
我曾参加过不计其数的讨论函数式编程的会议,每次都希望能彻底搞明白函数式编程中那些神秘的概念到底是什么意思。然而每次我都失望而归,那些概念在我脑海里乱成一团,我甚至不清楚自己学了些什么。也许我学到了些东西吧,但是很长时间以来我都不能确定自己学到了什么。
通过不断的编程实践,而非站在学术的角度,我慢慢的理解了那些对函数式编程者[1] 来说很简单直白的重要概念。你是否也有类似的经历 —— 你早就知道一件事,但直到很久之后你突然发现它竟然还有一个你从来不知道的名字!?
也许你像我一样;好几年前就听说过像“map-reduce”,“big data”等这些术语,但并不懂它们的实际意义。最终我明白了map(..)函数到底做了哪些事情 —— 在我知道列表操作是通向函数式编程者之路的基石,并且为何它们如此重要之后。我知道映射很久了,甚至在我知道它叫map(..)
之前。
最终我开始整理这些想法并将它们称之为「轻量级函数式编程」(FLP)。
但是,为什么学习函数式编程如此重要,即便只是学习轻量级函数式编程?
最近几年我越来越深刻的理解到编程的核心是人,而不是代码,我甚至将其视为一种信仰。我坚信代码只是人类交流的手段,只是它产生的副作用(仿佛听到了自我引用的笑声)才对电脑发出具体指令。
在我看来,函数式编程的核心在于让你在编程时使用一些广为人知、易于理解的模式。经过验证,这些模式可以有效隔离让代码难以理解的错误。所以,函数式编程 —— 咳,轻量级函数式编程 —— 是每个开发者都可以掌握的重要工具之一。
monad的含义是,一旦你搞懂了,你就无法跟别人解释什么是monad了。
Douglas Crockford 2012 "Monads and Gonads"
我希望这本书有可能打破上面的诅咒,尽管我们要到最后的附录部分才开始讨论「monad」。
科班出身的函数式编程者经常宣称只有 100% 使用函数式编程才算是真正地使用函数式编程:这是一种要么全有要么全无的主张。它会让人觉得如果编程时只有一部分使用了函数式编程而另一部分没用到,整个程序会被那些没有使用函数式编程的部分污染,从而认为使用函数式编程并不值得。
我想明确地说:我认为绝对主义并不存在。这没有意义,就像愚蠢地建议我只有使用完美的语法,这本书才算完美,如果犯了一点点错误,就会让整本书质量变低一样。
我写地越清楚,前后越一致,你阅读此书的体验将越好。但我不是一个完美无缺的作者。有些章节可能比另外一些写的好。但是那些有待提高的章节不会使书中写的好的部分黯然失色。
同样的道理也适用于代码。随着你越来越多的使用函数式编程的模式,你的代码质量会越来越高。25% 的时间使用它们,你会得到一些好处。80% 的时间使用它们,你将收益更多。
除了几处仅存的特例,你不会在本书里看到很多绝对的论断。我们讨论的是要追求的目标和现实中方方面面的权衡。
欢迎来到最实用的函数式编程的学习之旅。我们将共同探讨学习!