您好、欢迎来到现金彩票网!
当前位置:在线斗牛棋牌游戏 > 尾递归 >

为什么说 JavaScript 不擅长函数式编程

发布时间:2019-07-07 15:15 来源:未知 编辑:admin

  1【专注:Python+人工智能Java大数据HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】JavaScript 很适合函数式编程, 比如自带的数组操作方法常常能串联出比较漂亮的写法, 而且 React 在社区就算不能通吃, 但是已经取得了如此广泛的影响, 让大量的开发者接受了 reducer 纯函数这样的观念, 并在组件抽象上用于很多函数式编程的手法, 逐渐构建了强大的技术栈. 最终, 通过这些来验证 JavaScript 在函数式编程使用上的成功, 某种程度上算是自圆其说了, 而且也做出了成绩.

  但是这种理解从不同的角度观察, 还是存在问题的. 我从比较早就接触到了 CoffeeScript 以及深刻影响到它的语言: Haskell. 到现在, 我有三年多 CoffeeScript 开发的经验, 一年的 ClojureScript 小项目的经验, 以及勉强入门的 Haskell 学习经验. 站在 JavaScript 之外, 看到的情况跟在 JavaScript 社区内部看到的并不一样.

  知道合伙人软件行家采纳数:19511获赞数:53820某某公司最佳员工向TA提问展开全部主要有以下原因:

  Functionsasfirst-classvalues,函数一等公民,可以把函数作为参数传递,从而构造出高阶函数各种用法.这个用法各种语言都支持了:Lua支持,Python似乎也支持,Java也开始支持了,我会的语言少都举不出来不支持传函数的流行语言.

  Purefunctions,纯函数.可以写,但也有很大区别.JavaScript没限制,从而不能预判函数纯或者不纯.Clojure遵循Lisp风格的约定,带副作用的函数一般用`f!`这种叹号结尾的写法命名,而编译器没有约束.Haskell是严格约束的,出了名的IOMonad就是因为遵循纯函数导致副作用难以直接用数学函数表达出来,最终精心设计出一个概念.

  Referentialtransparency,引用透明,所以表达式可以被其运算结果完全替换掉,也就是要求控制甚至避免副作用.

  Controlledeffects,受控的副作用,主要手段是隔离.JavaScript需要人为地去隔离,语言层面完全没有限制.Clojure也需要人为隔离,就像前面说的`f!`那样的约定,同时规定了数据不可变,再加上作者有意在语言中强调控制副作用,实际上副作用少得多.Haskell通过类型系统限定,不隔离副作用无法通过编译的.

  Immutablevalues.JavaScript默认可变,仅有的手段用`Object.freeze`可以强行锁定对象或者const锁定变量本身,另外就是immutable-js那样的共享结构的不可变数据作为类库来实现.Clojure是把不可变数据和结构共享作为语言的基础,专门设计了Atom类型用于模拟共享的可变状态,也不排除某些场景和宿主语言的互操作还是会有可变数据.Haskell默认就是不可变数据,也有IORef相关的代码可以模拟可变状态,但在教程里几乎看不到.

  AlgebraicDatatypes,代数类型系统.JavaScript没有静态类型系统,TypeScript有类型,但和代数类型还不一样.Clojure没有静态类型系统,就算有而只是很基础的类型检查,或者用Specs做详细运行时检查.Haskell有强大的代数类型系统,即便是副作用也被涵盖在类型系统当中.

  Lazyevaluation,惰性计算.JavaScript是严格求值的,不支持惰性计算.Clojure支持Lazy,然而由于Clojure又允许了一些副作用,实际上某些特殊场景会需要手动force代码执行,也就是说不完美.Haskell采用惰性计算.惰性计算就是说代码里的表达式被真正使用来才会真正执行,否则就像是个thunk,继续以表达式存储着.我印象里Elm社区说过,对于图形界面来说Lazy反而是多余的.

http://missartypants.com/weidigui/274.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有