JavaScript函数式编程之pointfree与声明式编程

  • 时间:
  • 浏览:2
  • 来源:uu快3计划师_uu快3app苹果_全天计划

原文发布时间为:2018年06月17日

原文作者:砖用冰香焦

最后用有有有一好几个 来自Scott Sauyet的文章《Favoring Curry》中的例子,使用的函数式工具是ramda。下面的代码不时需一句一句的看,相当于体会一下就能那么 了。

正确的结果是

容易看出,命令式的代码,让让我门不但要去遍历,时需关注怎么才能 才能 遍历。而声明式的就容易这人 ,能那么 节省让让我门的注意力,代码也更加简洁。

至于那此说“固然那么 ,但使用命令式循环下行速率 要快这人 ”的人,我建议让让我门先去学得 JIT 优化代码的相关知识。这里有有有有一好几个 非常棒的视频,因为会对你有帮助。

这人 的命令式的写法有:使用ifelse进行的条件判断,使用算数运算符进行的算数运算,使用比较运算符进行的比较运算和使用逻辑运算符进行的逻辑运算。

从曾经深度看,有参的函数的目的是得到有有有一好几个 数据,而pointfree的函数的目的是得到曾经函数。 这人 ,如下的方程,固然也有参,能够那么 认为是pointfree的。

const titlesForYear = year =>
  pipe(
    filter(publishedInYear(year)),
    map(book => book.title)
  )

那这pointfree有那此用? 它能那么 让让我门都把注意力集中在函数上,参数命名的麻烦肯定是省了,代码也更简洁优雅。 时需注意的是,有有有一好几个 pointfree的函数因为是由众多非pointfree的函数组成的,也这人 我说底层的基础函数大也有有参的,pointfree体现在用基础函数组合而成的高级函数上。因为让让我门使用函数式编程的工具,如ramda,那此基础函数大都因为被写好了,曾经让让我门去写pointfree的代码就很容易了。

一组JSON数据

更多相关内容见博客 github.com/zhuanyongxi…

命令式的代码如下

getIncompleteTaskSummaries = function(membername) {
    return fetchData()
        .then(function(data) {
            return data.tasks;
        })
        .then(function(tasks) {
            var results = [];
            for (var i = 0, len = tasks.length; i < len; i++) {
                if (tasks[i].username == membername) {
                    results.push(tasks[i]);
                }
            }
            return results;
        })
        .then(function(tasks) {
            var results = [];
            for (var i = 0, len = tasks.length; i < len; i++) {
                if (!tasks[i].complete) {
                    results.push(tasks[i]);
                }
            }
            return results;
        })
        .then(function(tasks) {
            var results = [], task;
            for (var i = 0, len = tasks.length; i < len; i++) {
                task = tasks[i];
                results.push({
                    id: task.id,
                    dueDate: task.dueDate,
                    title: task.title,
                    priority: task.priority
                })
            }
            return results;
        })
        .then(function(tasks) {
            tasks.sort(function(first, second) {
                var a = first.dueDate, b = second.dueDate;
                return a < b ? -1 : a > b ? 1 : 0;
            });
            return tasks;
        });
};

需求是找到Scott所有未完成的任务,并按照到期日期升序排列。

pointfree的代码

var getIncompleteTaskSummaries = function(membername) {
  return fetchData()
    .then(R.prop('tasks'))
    .then(R.filter(R.propEq('username', membername)))
    .then(R.reject(R.propEq('complete', true)))
    .then(R.map(R.pick(['id', 'dueDate', 'title', 'priority'])))
    .then(R.sortBy(R.prop('dueDate')));
};

pointfree的声明式的代码

// 提取 tasks 属性
var SelectTasks = R.prop('tasks');

// 过滤出指定的用户
var filterMember = member => R.filter(
  R.propEq('username', member)
);

// 排除因为完成的任务
var excludeCompletedTasks = R.reject(R.propEq('complete', true));

// 选取指定属性
var selectFields = R.map(
  R.pick(['id', 'dueDate', 'title', 'priority'])
);

// 按照到期日期排序
var sortByDueDate = R.sortBy(R.prop('dueDate'));

// 合成函数
var getIncompleteTaskSummaries = function(membername) {
  return fetchData().then(
    R.pipe(
      SelectTasks,
      filterMember(membername),
      excludeCompletedTasks,
      selectFields,
      sortByDueDate,
    )
  );
};

时需注意的是,要实现一种生活声明式的编程,首先让让我门要一种生活map法律土妙招,一种生活点与pointfree相同,也有时需让让我门先对常用的操作做一次封装,而那此常用的操作一种生活还是命令式的。

本文来源: 掘金 如需转载请联系原作者

函数式编程中的pointfree的意思这人 我“无参”或“无值”,pointfree style是一种生活编程范式,也作tacit programming,这人 我“无参编程”的意思了。那此是“无参编程”?

那此是声明式编程?它区别于命令式编程

pointfree的声明式代码是函数式编程应该有的样子。