函数是编程早就有了,不是只有F#。但是F#让我真正的了解和使用了函数式编程。
记得在GE的时候就深刻的感觉到,一家大的公司对技术的发展是举足轻重的。当然这是题外话了。
以前都是当作茶余饭后的随便看看,但是最近自己亲自用了一下,还是发现一些认识上的惯性误区。
随感随写,不断更新。
1、个人认为函数式编程(FOP),其实就是两个内容:数据和过程。
虽然二者都统一在一个let定义下,但是实际上二者是对立统一的。
这一点跟面向对象编程OOP不同。OOP也是将二者对立统一,但是有对象这一概念,将二者包起来了。
函数式编程则不同,二者区分就很明显。
一个函数一旦定义,就一直可以使用,而不需要什么初始化,这就是个“过程”而已。
不仅如此,匹配match,管道|>,<|,以及组合<<,>>使得这些过程能够链接起来,看上去就像流动的河流一样,让数据流动,很清晰。
而OOP让程序看上去更像个自动机,WPF 数据绑定就是一个经典。
正是因为强调“过程”这一概念,函数是编程在多核应用上很有优势。
2、函数内部能够定义函数。
OOP可不行!
3、变量还是分引用和值两个类型。
这是dotnet经典类型了。
引用类型的用ref、:=、!关键字
值类型的用<-
4、C#的委托要用到F#里要做转换。
5、建议初学者参数和返回类型都写全,不要让编译器自动推理。
否则经常不知道自己错在哪里。
6、LOP没有命令语言,比如break、continue、return、goto
LOP处理的数据都是块状的,比如vector、matrix、list、seq、数组等等。
所以个人认为LOP所使用的内存应该比用其他语言写的程序大很多。
7、LOP确实适合写算法(程序逻辑)。
以前在稿纸上都只能用流程图来写算法,修改算法,因为C++、C#的代码一些写一大堆,什么大括号,函数定义,烦死了。
F#就不一样了,最近几个流程都是用F#在稿纸上写的,很清晰。基本上写完了,就是最终的Code。以前即使用伪代码写的流程,到VS里用C++、C#写,要处理一下。
8
match Cross (p1.ToPoint2d()) (p2.ToPoint2d()) (hd.ToPoint2d()) (tl.Head.ToPoint2d()) with