• 函数式编程初探一


    前言

    道生一,一生二,二生三,三生万物。
    如果把这三看做顺序,分支,循环,
    那么三生万物是指,它们能表达所有计算机程序逻辑。
    如今它们有两种书写方式,哪种更优?
    如人饮水,冷暖自知。

    分支

    存在就是被选择。
    大多数分支场景,可用if...else if...else或者switch来实现。
    demo 4-0

    // if...else
    var R = require('ramda');
    
    var gt10_normal = function(a){
      if(a > 10){
        return a - 10;
      }
      else{
        return a + 5
      }
    }
    
    var gt10 = R.ifElse(
      function(a){ return a > 10 },
      function(a){ return a - 10 },
      function(a){ return a + 5 }
    );
    
    var num = gt10(11);
    

    demo 4-1

    // switch
    var R = require('ramda');
    
    var fn = R.cond([
      [R.equals(0),   R.always('I am 0')],
      [R.equals(100), R.always('I am 100')],
      [R.T,           function(temp){ return 'I am not 0 or 100. I am ' + temp}]
    ]);
    
    
    // 常规写法
    var fn_normal = function(temp){
      switch(temp){
        case 0:
          console.log('I am 0');
          break;
        case 100:
          console.log('I am 100');
          break;
        default:
          console.log('I am not 0 or 100. I am ' + temp);
      }
    }
    
    fn(99);
    fn_normal(100);
    
    

    demo 4-2

    var R = require('ramda');
    var eq10add1 = R.unless(R.equals(10), R.inc);
    eq10add1(6);         //=> 7
    eq10add1(10);        //=> 10
    
    // 常规写法
    
    var eq10add1_normal = function(temp){
      if(temp != 10){
        return temp + 1;
      }
      return temp;
    }
    
    

    循环

    落红不是无情物,化作春泥更护花。
    函数式编程的循环分两步,筛选和遍历。而命令式编程往往这两步合二为一。
    比如下面这个1+2+3+4+5...的例子。
    demo 5-0

    var R = require('ramda');
    var log = console.log;
    
    // 命令式编程的循环
    function command_increase(max){
      var total = 0;
      var i = 0;
      while(i <= max){
        total = total + i;
        i++;
      }
      return total;
    }
    log(command_increase(5));
    
    
    // 函数式编程的循环
    function functional_increase(max){
      var filterFn = R.curry(function(value ,max){
        return R.last(value) >= max;
      });
      var filterFn5 = filterFn(R.__, max);
      // 1.筛选
      var filterNum5 = R.until(filterFn5 , function(array){array.push(R.last(array)+1); return array; } );
    
      // 2.遍历
      var total_func = R.compose( R.reduce(function(a,b){ return a+b }, 0), filterNum5);
      return total_func([0]);
    }
    
    log(functional_increase(5));
    
    
  • 相关阅读:
    利用角色简化playbook
    lamp
    playbook部署lamp
    ansible-playbook配置不同系统yum源
    66. 加一
    628. 三个数的最大乘积
    977. 有序数组的平方
    383. 赎金信
    203. 移除链表元素
    83. 删除排序链表中的重复元素
  • 原文地址:https://www.cnblogs.com/samwu/p/5895191.html
Copyright © 2020-2023  润新知