zoukankan      html  css  js  c++  java
  • [Ramda] Eliminate Function Arguments (Point-Free Style) with Ramda's Converge

    When doing comparisons inside of functions, you end of relying heavily on the argument passed into the function. Ramda's converge allows you to do comparisons in a Point-Free style allowing you more flexibility with composing and constructing functions. This lesson walks through refactoring a function to Point-Free style using Ramda's Converge.

    For example we want to find the whether the first item of an array is the biggest number:

    const shouldBeTrue = [6, 3, 4, 5, 2, 1]
    const shouldBeFalse = [3, 4, 5, 2, 1]
    
    const isFirstBiggest = (xs) => xs[0] == xs.sort((a, b) => b - a)[0]
    
    console.log(isFirstBiggest(shouldBeTrue)) // true
    console.log(isFirstBiggest(shouldBeFalse)) // false

    In the code we can see this:

    const isFirstBiggest = (xs) => xs[0] === xs.sort((a, b) => b - a)[0]

    You can find that, param 'xs' appears both on the left and right side of euqals sign.

    If match this partten, we actually can use 'converge' from  Ramda.

    invoked, this new function is applied to some arguments, each branching function is applied to those same arguments. The results of each branching function are passed as arguments to the converging function to produce the return value.

    For example:

    const shouldBeTrue = [6, 3, 4, 5, 2, 1]
    const shouldBeFalse = [3, 4, 5, 2, 1]
    
    import {
      converge, equals, head, sort, descend, identity, compose
    }
    from 'ramda'
    
    const biggestNumberOfArray = compose(
      head,
      sort(descend(identity))
    );
    const isFirstBiggest = converge(
      equals, [
        head,
        biggestNumberOfArray
      ]
    );
    
    // xs =>
    //     xs[0] == xs.sort((a, b) => b - a)[0]
    
    
    
    console.log(isFirstBiggest(shouldBeTrue))
    console.log(isFirstBiggest(shouldBeFalse))

    So in the code:

    converge(
      equals, [
        head,
        biggestNumberOfArray
      ]
    )

    converge takes two params, first params is 'R.equals'. It tells what should do with the second param. Here is checking whether they are equal.

    Second param is an array, take tow expersions.

    R.head --> xs[0]
    biggestNumberOfArray --> xs.sort((a,b) => b-a)[0]

    More example:

    var average = R.converge(R.divide, [R.sum, R.length])
    average([1, 2, 3, 4, 5, 6, 7]) //=> 4
    
    var strangeConcat = R.converge(R.concat, [R.toUpper, R.toLower])
    strangeConcat("Yodel") //=> "YODELyodel"
  • 相关阅读:
    小程序---云开发----云函数
    小程序的基本概念-生命周期(组件 wxml)
    小程序的基本概念
    vue登录功能和将商品添加至购物车实现
    vue脚手架创建项目
    node.js评论列表和添加购物车数据库表创建
    学习脚手架--组件之间跳转与参数(组件之间参数)
    node.js 需要注意知识点
    如何查询小程序官方手册
    vue ui九宫格、底部导航、新闻列表、跨域访问
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6389410.html
Copyright © 2011-2022 走看看