资讯专栏INFORMATION COLUMN

【个人向】20180916 - Read AND Think

邱勇 / 2532人阅读

摘要:可移植性可移植性可以意味着把函数序列化并通过发送。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。最后一个并行代码,就是说可以并行运行任意纯函数。因他们不需要访问共享的内存,也不会因副作用而进入竞争状态。

前言

因为想弥补一下自己对一些函数式编程的了解和体会,所以特意找了一些资料来阅读~以下的感想是来自于这本书哒:

《JS 函数式编程指南》 
作者: Franklin Risby for his great work!
地址:https://legacy.gitbook.com/bo...
什么是纯函数

纯函数就是保证输入和对应的输出是相同的函数,也就类似于我们课本中学的函数的概念!一个x永远只对应一个y值。

比如,js中存在的会改变原数组的一些数组操作函数,这些就是不纯的。
主要是有共享的变量和成员,比如全局变量之类的。

纯的好处

可缓存性(Cacheable)

可移植性/自文档化(Portable / Self-Documenting)

可测试性(Testable)

合理性(Reasonable)

并行代码

对于可缓存性,有下面这段“通用”的代码,提取一次(即计算)就缓存一次,后面取的时候就不用重新计算了:

var memoize = function(f) {
  var cache = {};

  return function() {
    var arg_str = JSON.stringify(arguments);
    cache[arg_str] = cache[arg_str] || f.apply(f, arguments);
    return cache[arg_str];
  };
};

而如果函数是不纯的话,我们并不能靠输入的值来提取出唯一对应的结果,因为它可能有多种情况。

可移植性

可移植性可以意味着把函数序列化(serializing)并通过 socket 发送。也可以意味着代码能够在 web workers
中运行。总之,可移植性是一个非常强大的特性。

自文档化是说把需要的数据都写在参数里,不写成比如对象的形式,因为对象的属性可以在外面被修改所以可能会造成不一样的结果。
而把参数都列出来,这样使用者也知道它需要什么数据,也就是像有文档一样告诉你。

可测试性
我们很多情况下都是要测试某一个函数或者某一个部分,如果这个函数依赖一些全局的东西,我们在设置断点的时候涵盖的范围就会很大,所以这样会影响我们的测试。而纯函数可以让我们只专注于这一个函数。

断言:表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。

合理性

如果一段代码可以替换成它执行所得的结果,而且是在不改变整个程序行为的前提下替换的,那么我们就说这段代码是引用透明的。
我们可以使用一种叫做“等式推导”(equational
reasoning)的技术来分析代码。所谓“等式推导”就是“一对一”替换,有点像在不考虑程序性执行的怪异行为(quirks of
programmatic evaluation)的情况下,手动执行相关代码。

最后一个并行代码,就是说可以并行运行任意纯函数。因他们不需要访问共享的内存,也不会因副作用而进入竞争状态。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97817.html

相关文章

  • Think-Casbin:一个专为ThinkPHP打造的轻量级访问控制库,支持RBAC/ACL等权限

    摘要:是一个用语言打造的轻量级开源访问控制框架,目前在开源。采用了元模型的设计思想,支持多种经典的访问控制方案,如基于角色的访问控制基于属性的访问控制等。一个专为定制的的扩展包。 PHP-Casbin 是一个用 PHP 语言打造的轻量级开源访问控制框架( https://github.com/php-casbin... ),目前在 GitHub 开源。PHP-Casbin 采用了元模型的设计...

    lieeps 评论0 收藏0
  • 入手thinkjs,学习笔记

    摘要:最近刚刚学习了一个的开发框架,最重要的是可以用开发传送门以下是学习过程中的笔记上面时全局安装完成后用检查是否成功创建了一个名为的项目,然后进入目录,安装依赖,启动项目,浏览器打开就可以看到页面了。 最近刚刚学习了thinkjs--一个node的MVC开发框架,最重要的是可以用es6/es7开发【传送门】 以下是学习过程中的笔记: npm install thinkjs@2 -g --v...

    shuibo 评论0 收藏0
  • pandas的to_csv()使用方法

    摘要:首先查询当前的工作路径获取当前工作路径方法是类的方法,是的方法默认是的一个实例,参数解释如下路径相对位置,保存在获得的路径下绝对位置分隔符使用分隔需要保存的数据,如果不写,默认是替换空值确实值保存为,如果不写,默认是空格式保留两位小数是否保 1 .首先查询当前的工作路径: import os os.getcwd() #获取当前工作路径 2 .方法: to_csv()是DataF...

    vvpvvp 评论0 收藏0
  • Vue+thinkJs博客网站(二)之thinkJs的使用

    摘要:插件机制可以说是自定义的钩子函数。首先在新建文件夹,新建文件以为例更新内容缓存里对应的数组表示钩子函数的调用名,具体调用的是下面的方法。 一.简介 这个个人博客网站最初制作的目的就是练习使用thinkJs,这一篇就主要讲一下thinkJs的一些特性和注意事项。涉及到了文件上传,thinkJs的插件机制,model层建立以及CURD的编写方式等。本项目github地址在这里。 项目thi...

    desdik 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<