FP Monad

发布时间 2023-10-08 22:39:17作者: lsgxeva

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门计算机核心课程中两门是函数式相关的,另外一门是使用函数式语言做课程作业的算法和数据结构

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 ,使用Scala。这门课Coursera上也开了,所以自学挺方便的。课程结构和SICP很像。

UW Programming Languages CSE341, Autumn 2015,里面讲了各种编程范式,函数式这块使用了Scheme。如果只是为了了解,可能这种比较式的课程更合适。这门课Coursera上也开了,自学方便。


 

---------------

作者:Hugo
链接: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

Kyle Simpson 是 JavaScript 语言非常资深的大师。他对函数式编程有很多书。上面这个链接是最近刚出来的,这个链接里面其实也有很多资源。

Kyle Simpson 的课程非常深入浅出,但是个人感觉,其实就和他说的一样,函数式编程是一个多面的东西,你每次只能学一面,很多小的点最后合起来,才是最后你脑海里的函数式编程。

3、TypeScript

GitHub - gcanti/fp-ts: Functional programming in TypeScript

Giulio Canti' 是意大利人,他自己写的教程是意大利语的,上面这个是英文版

FP-TS 实际上已经是挺庞大的一个社区了,用的人很多。类型写的非常全,但是因为太全了,其实有点难(难是我的问题。。)

最后

FP 难,其实是难在它是一门数学和工程结合的东西,你在弱化它的数学部分,也无法忽视它。

而数学,个人认为,就是你如果不会证明它,你也不一定会使用它。我之前看了很多 Monad 的东西,都看的模模糊糊,直到有一次实现了一个 Continuation,才对 Monad 有一个新的认识。那一次实现 Continuation,后面的算子都有现成的代码,Continuation 的接口定义也有,唯独缺 Continuation 的构造函数,函数容器的构造函数非常重要,因为所有算子,都是组合了构造函数,所有的 “律”,实际上都是构造函数和接口一起保证的。

在实现那个构造函数的时候,我才感觉,这玩意哪里是编程,就是推公式嘛。。我个人建议,这东西不能光用,光用,你不一定有感觉,最好能自己用代码推一推,主要是构造函数,其他的算子其实都好说。个人理解,只要每个函子的构造函数都推一遍(用代码,最好有类型范型,js 比 ts 简单非常多),对这个东西的理解应该能提升不少。

最后,建议直接学英文版本的。说实话,不要纠结名字和概念,重要的是那个逻辑,或者律。这一块的东西,外国人学起来也费劲,语言不是问题。术语,你见多了,就知道是啥了,不需要翻译。看中文的东西,有可能会让你云里雾里的。这东西用英语讲都费劲,在用中文翻译一遍,那含义。。。尽快到代码,代码的意义远大于文字。从工程的角度,所有的律都是为了任意搞都是 ok 的,叫啥根本不重要。但是律很重要,其实所有的律,从代码的角度来说,就是一些东西不变,然后传入的函数塞到了某个地方了。律的普适性决定了,律的代码其实都很简单。但是其实,你会发现,简单的东西,其实不好懂。你会写,你不一定会推,你会推,你不一定知道为啥要这么推,你知道为啥这么推,你可能不知道为啥要有这个律,你知道有这个律,你不知道为啥能有这么多种组合,这么多种组合的关系是啥。这里面的可能性,其实还是挺庞大的。总之,这里面几乎所有的东西,呈现最好的方式,应该就是代码了,因为我一开始搞函数式是搞的 ramda,用的 js,切换到 ts 以后,发现以前觉得自己明白了,但是实际上加上类型,完全是一个新的领域了。。。

 

---------------

作者:satanson
链接: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