FP Monad
FP Monad
https://github.com/getify/monio/blob/master/MONADS.md
链接:https://www.zhihu.com/question/48415751/answer/110822587
Scheme、Standard ML偏教学,语法要简单很多,学习资源也丰富,更适合用来了解核心的函数式编程思想。Scala这些偏向开发,可能更实用,但也更繁琐了,python、c++中都吸收了函数式语言的思想,但是比较分散。主要思想掌握了,上手同类东西还是很快的,所以Scheme、SML挺好的。
另外不管学习哪种函数式语言,工作上可能都不能直接用。干脆不要太计较语言,找一个靠谱的学习资料更重要。下面列举一些课程吧:
CMU 15-150 ,使用SML。可能是感觉并行和分布式的春天来了,CMU突然开始非常重视函数式编程,7门计算机核心课程中两门是函数式相关的https://www.csd.cs.cmu.edu/content/bachelors-curriculum-admitted-2014,另外一门是使用函数式语言做课程作业的算法和数据结构http://www.cs.cmu.edu/~15210/index.html)
MIT 6.037 - Structure and Interpretation of Computer Programs,使用Scheme。使用的是SICP这本与课程同名的书,曾经的课程编号是6.001,是MIT EECS必学的4门课程之一。现在的和MIT6.001对应的是MIT6.00,编程语言换成了Python,相对之前使用Scheme的6.001,更强调动手做一些玩具而不是编程理论了。
Berkeley CS 61A Summer 2016,使用Scheme。Berkeley非常推崇MIT的SICP,曾经CS61的主讲评价SICP是“the best computer science book in the world”,所以Berkeley之前用的也是Scheme。不过新的CS61也换成了Python,然而不同于MIT,Berkeley新的CS61讲授的内容结构和SICP基本一样,只是语言不同,而且仍然保留了Scheme版的SICP作为自学课,就是现在的CS61A。
EPFL Functional Programming Principles in Scala https://www.coursera.org/learn/progfun1,使用Scala。这门课Coursera上也开了,所以自学挺方便的。课程结构和SICP很像。
UW Programming Languages CSE341, Autumn 2015,里面讲了各种编程范式,函数式这块使用了Scheme。如果只是为了了解,可能这种比较式的课程更合适。这门课Coursera上也开了,自学方便。
---------------
链接:https://www.zhihu.com/question/48415751/answer/2322099844
1、scala:
推荐 lihaoyi Haoyi's Programming Blog
What's Functional Programming All About?
From First Principles: Why Scala?
lihaoyi 的介绍:
Haoyi is a software engineer, and the author of many open-source Scala tools such as the Ammonite REPL and the Mill Build Tool. If you enjoyed the contents on this blog, you may also enjoy Haoyi's bookHands-on Scala Programming
虽然 scala 现在确实有点小众,但是已经是众多FP语言里最工程的一个了,至少有 spark 扛顶。
2、JavaScript
https://github.com/getify/monio/blob/master/MONADS.md#fp--monads
Kyle Simpson 是 JavaScript 语言非常资深的大师。他对函数式编程有很多书。上面这个链接是最近刚出来的,这个链接里面其实也有很多资源。
Kyle Simpson 的课程非常深入浅出,但是个人感觉,其实就和他说的一样,函数式编程是一个多面的东西,你每次只能学一面,很多小的点最后合起来,才是最后你脑海里的函数式编程。
3、TypeScript
GitHub - gcanti/fp-ts: Functional programming in TypeScript
https://github.com/enricopolanski/functional-programming
Giulio Canti' 是意大利人,他自己写的教程是意大利语的,上面这个是英文版。
FP-TS 实际上已经是挺庞大的一个社区了,用的人很多。类型写的非常全,但是因为太全了,其实有点难(难是我的问题。。)
最后
FP 难,其实是难在它是一门数学和工程结合的东西,你在弱化它的数学部分,也无法忽视它。
而数学,个人认为,就是你如果不会证明它,你也不一定会使用它。我之前看了很多 Monad 的东西,都看的模模糊糊,直到有一次实现了一个 Continuation,才对 Monad 有一个新的认识。那一次实现 Continuation,后面的算子都有现成的代码,Continuation 的接口定义也有,唯独缺 Continuation 的构造函数,函数容器的构造函数非常重要,因为所有算子,都是组合了构造函数,所有的 “律”,实际上都是构造函数和接口一起保证的。
在实现那个构造函数的时候,我才感觉,这玩意哪里是编程,就是推公式嘛。。我个人建议,这东西不能光用,光用,你不一定有感觉,最好能自己用代码推一推,主要是构造函数,其他的算子其实都好说。个人理解,只要每个函子的构造函数都推一遍(用代码,最好有类型范型,js 比 ts 简单非常多),对这个东西的理解应该能提升不少。
最后,建议直接学英文版本的。说实话,不要纠结名字和概念,重要的是那个逻辑,或者律。这一块的东西,外国人学起来也费劲,语言不是问题。术语,你见多了,就知道是啥了,不需要翻译。看中文的东西,有可能会让你云里雾里的。这东西用英语讲都费劲,在用中文翻译一遍,那含义。。。尽快到代码,代码的意义远大于文字。从工程的角度,所有的律都是为了任意搞都是 ok 的,叫啥根本不重要。但是律很重要,其实所有的律,从代码的角度来说,就是一些东西不变,然后传入的函数塞到了某个地方了。律的普适性决定了,律的代码其实都很简单。但是其实,你会发现,简单的东西,其实不好懂。你会写,你不一定会推,你会推,你不一定知道为啥要这么推,你知道为啥这么推,你可能不知道为啥要有这个律,你知道有这个律,你不知道为啥能有这么多种组合,这么多种组合的关系是啥。这里面的可能性,其实还是挺庞大的。总之,这里面几乎所有的东西,呈现最好的方式,应该就是代码了,因为我一开始搞函数式是搞的 ramda,用的 js,切换到 ts 以后,发现以前觉得自己明白了,但是实际上加上类型,完全是一个新的领域了。。。
---------------
链接:https://www.zhihu.com/question/48415751/answer/111892697
一直研究函数式编程,实在太喜欢函数式编程了,虽然工作用不到,但是这种大道至简,分形几何可以与其媲美, 之前看别人介绍周易,提到了一种全息的思想, 也就是说构成整体的部分包含了整体的全部信息。我一直像写函数式编程思想的文章,借你的问题,我大致说一下吧。其实minecraft也有这样的特点。
函数式编程最根本的思想是 higher-order function 和 algebraic datatype。
1. higher-order function,就是function is first-class citizen,可以用高阶函数构造数据结构,因为有了closure就有了所需要的一切, 当然工具函数 map、foldr、foldl和filter不得不提。
2. algebraic datatype ,在SCIP中提到了代数数据类型, 在haskell中干脆把用户定义的数据类型直接称为algebraic datatype。总之,你的数据类型采用递归定义,能够通过ctor,selector去构造,获取部分,而且部分和整体同构,非常方便递归函数处理。 haskell,scala,c++中的pattern match非常适合处理algebraic datatype。
3. pure function and immutable datatype: 只有函数是pure,datatype是immutable(当然局部可以mutable)才可以进行lazy evaluation。delay evaluation传递的是form,而form只需要采用memo
计算一边,cache起来,直接用就可以了。 当然memo就是local mutable的数据结构。
4. lazy evaluation:为什么要lazy evaluation呢? 因为lazy evaluation的好处有:1.只计算一次,2.short circuit 3. stream,也就是infinite数据解构。
5. macro:Lisp支持宏,有了宏才有form,有了form才可以让lazy evaluation写起来漂亮,否则写成闭包多丑陋,不支持的macro的haskell的evaluation本身就是laziness,除非加!。
6. monad: 谜一般的monad,只有形式,没有内容,实在是haskell中的第一杀器。
7. proper tail recursion或者tail recursion optimizing:将普通的递归函数写成in-place计算的iterative形式的计算,当然编译器得支持,据说clojure不支持尾递归优化。
8. reason about equation: 参考programing in haskell,怎么将普通的递归函数修改为尾递归。
9. meta-programming:函数式编程提供了强大的元编程能力。
=========== End