三九宝宝网宝宝教育教学论文

函数式编程Functional Programming相比面向对象编程Object

12月30日 编辑 39baobao.com

[C语言的strcmp用函数表示]1. 首先记住一件事,C语言中,数值0表示假,非0表示真(即!0=true) 2. *(unsigned char *)src,表示取src字符串中第1个字符 3. *(unsigned char *)dst,表示取dst字符串中第1个字符 4. re...+阅读

函数作为一等公民和 closure capture 好处大家都知道, 传统语言都在想方设法集成这些特性. map, filter, reduce 等等东西写代码处理集合真是非常舒爽, 一眼就能看懂干什么, 又不用担心循环中的边界条件.- 函数式语言中的另一个利器是 pattern match, 很多费脑子的复杂操作一下就搞定了... 为什么 Thinking in Java 这么大这么厚一本书, 学完了你基本干不了啥事情? 因为在 Java 的思维世界里, 你要和概念的海洋作斗争, 而命名恰恰就是编程的两大难题之一. 如果有 pattern match, 哪用想这么多没意义的中间变量名?- 什么是 immutability? 其实细分起来有语法上的 immutable (例如 Java 里的 final 关键字), 和运行时对象的 immutable(一个变量名可以修改指向不同对象, 但对象的内容不可变). 两者的联系是: 如果语法上规定所有变量都是 "final" 的, 那么运行时对象就相当于都 immutable 了. 但如果语法上部分变量是 final, 部分不是, 那么就不能得出运行时对象全都 immutable 的结论. 而在运行时对象都是 immutable 的情形下, 很多优势才会显现出来.- "immutability 会拖慢程序" 略扯淡, 应用了 immutability 的 VM 实现可以去掉很多情况的 lock, 并发处理速度会更快.就算不是并发处理的情况, 如果所有对象都 immutable, 手动的保护性拷贝都可以去掉, 处理复杂业务会更简单快速.其实编译器可以把很多 immutable 的操作改写成 mutable 的操作, RAM 能不能擦写没什么影响的. LLVM 中间语言就是个变量名 immutable 的语言, 但是编译出来的代码效率很高 --- 编译器就是这么贱, 你明明为了提高性能重复利用同一个变量, 但是它却偏偏要先把你写的单个变量改成多个变量单次赋值再去做优化...对象实例 immutable 了 GC 能更简化. 因为只有新对象指向老对象, 老对象不能指向新对象, 对实现分代 GC 的人来说真是一个天堂! Haskell 和 Erlang 的分代 GC 实现都不复杂而且效率很高 (但 Clojure 因为是 JVM 上的二奶语言享受不到这个优惠, Scala 不是所有对象都 immutable, 只能起用接口限制程序员的效果了...)在 immutable 的环境里还有什么好处? 就是没有环引用! 不用做环检测不用加弱引用, 那引用计数还不爽翻了? 是的... 有人用引用计数实现 Erlang 的, 写得非常爽... 我也在写一个语言, 所有变量 immutable, 就用引用计数做内存管理, 当引用数为 1 的时候还能做 destructive update, 节省一次内存分配释放, 也不损害 immutable 的语义哦 (巨坑中, stay tuned...).immutable 的环境还能轻易实现 debug step back. 至今大部分语言和环境的 debugger 都没有后退功能, 而后退功能的实现难点主要是要保存对象变化的历史记录, mutable 的对象系统就得复制或者深复制对象才能恢复历史. 而 immutable 的环境里, 只要保留之前的对象的引用, 就能直接恢复.immutability 至今表现还不太好的地方是哈希表, 例如 Haskell 的哈希表实现就一片混乱... 如果要实现一个高效的 immutable 并且保持插入顺序的哈希表... 你会比较蛋疼. 现在做得比较好的是 HAMT 或者 RRB tree, 但也没有 mutable 的哈希表快.- immutable 会造成代码比较难写吗? 事实上就是思维方式要改变, 用更高阶的操作就好了, 然后你会发现经常变得更好写了. 而且 state monad + do notation 可以让你退回去用 mutable 的思维方式想问题, 而且, 这个 state 是严格控制在 local 的不会搅乱你其他部分的程序.如果所有对象都 immutable, 那程序根本就没有传值和传引用的区别了, 学习起来更简单, 语义更一致 (但一心要当大杂烩的 Scala 反而变得很复杂...)- 组件和对象会不会比 immutable 更适合 GUI 编程? 现状是 functional language 在 GUI 库上面还不够成熟, 但应用 functional 概念架构的 GUI 反而速度更快更稳定, 在 web 前端框架上面已经逐渐体现了, 例如 swannodette/om · GitHub 和 Raynos/mercury · GitHub. 用 Om 实现一个历史后退的功能真的清爽容易到了极点.- 函数式语言中常用的 list 也受限于当前的 CPU 架构体系, locality 没有 array 好, 不过很多 list 中使用的 idiom 也可以直接应用到 array 上, 问题不大.- 某些面向对象的方法论使用大量的隐喻, 使得不懂的人都可以以为自己懂了, 也许才是其最重要的优势吧.

以下为关联文档:

c语言的static与函数变量你在函数中定义static变量,在定义的时候须得给他赋值,而且在程序运行中,只有第一次调这个函数时你所赋的值才有效果,之后每次调此函数,都不会重新给他赋值了(例如staitc a = 10,下...

static这个函数static 是C中很常用的修饰符,它被用来控制变量的存储方式和可见性 static 声明的变量在C语言中有两方面的特征: 1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时...

c语言结构体函数:PHP的语言结构和函数的区别1、 什么是语言结构和函数 语言结构:就是PHP语言的关键词,语言语法的一部分;它不可以被用户定义或者添加到语言扩展或者库中;它可以有也可以没有变量和返回值。 函数:由代码块组...

为什么说面向对象编程函数编程先从结构化编程说起 很久以前,软件开发的世界还是一片浑浑噩噩,不管开发什么软件都面临着复杂性这个问题,代码里面到处是goto语句,程序的流程随意跳转。众生写代码时,越写到后面...

除了erlang还有什么有比较大规模实用的函数式语言吗最早的函数式语言当然是Lisp,现在有两个分支:Common lisp 和Scheme。Common lisp 是一个庞大的语言,支持多种编程范式,Scheme是Common lisp的子集,二者都是ANSI标准。Scheme 由于...

scala是函数编程和面向对象编程结合的语言这两种编程的特点分函数编程或称函数程序设计,又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda cal...

函数编程和反应式编程有什么区别这个是我的理解: coffee# 函数式 trimLeft = (text) -> switch when text.length is 0 then text when text[0] is ' ' then trimLeft text[1..] else text # 过程式 trimLef...

java8函数编程和lambda的区别很多编程语言早就引入了Lambda表达式而java语法又比较繁琐,被很多人嫌弃.于是java8新增了特性支持Lambda表达式.例如:不用Lambda表达式写的匿名内部类List names = Arrays.asL...

Java函数编程语言是什么函数编程语言的核心是它以处理数据的方式处理代码。这意味着函数应该是第一等级(First-class)的值,并且能够被赋值给变量,传递给函数等等。 事实上,很多函数式语言比这走得更远...

推荐阅读
图文推荐