• [JS Compose] 6. Semigroup examples


    Let's we want to combine two account accidently have the same name.

    const acct1 = { name: 'Nico', isPaid: true, points: 10, friends: ['Franklin'] }
    
    const acct2 = { name: 'Nico', isPaid: false, points: 2, friends: ['Gatsby'] }

    So, here we can use Semi-group to combine them, because the semi-group have the knowledge how to combine for each type of object.

    So we change two accounts as:

    const acct1 = { name: First('Nico'), isPaid: All(true), points: Sum(10), friends: ['Franklin'] }
    
    const acct2 = { name: First('Nico'), isPaid: All(false), points: Sum(2), friends: ['Gatsby'] }

    But here we still have one problem which Object doesn't have 'concat' method, so we need to use Immutable library to help:

    Includes libarary:

    const {Map} = Immutable;
    const acct1 = Map({ name: First('Nico'), isPaid: All(true), points: Sum(10), friends: ['Franklin'] })
    
    const acct2 = Map({ name: First('Nico'), isPaid: All(false), points: Sum(2), friends: ['Gatsby'] })

    ---------

    const {Map} = Immutable;
    
    const Sum = x =>
    ({
      x,
      concat: ({x: y}) =>
        Sum(x + y),
      inspect: () =>
        `Sum(${x})`
    })
    
    const All = x =>
    ({
      x,
      concat: ({x: y}) =>
        All(x && y),
      inspect: () =>
        `All(${x})`
    })
    
    const First = x =>
    ({
      x,
      concat: _ =>
        First(x),
      inspect: () =>
        `First(${x})`
    })
    
    const acct1 = Map({ name: First('Nico'), isPaid: All(true), points: Sum(10), friends: ['Franklin'] })
    
    const acct2 = Map({ name: First('Nico'), isPaid: All(false), points: Sum(2), friends: ['Gatsby'] })
    
    const res = acct1.concat(acct2)
    
    // Showing results
    console.log("Friend 1: ", res.toJS().friends[0]) //Friend 1: Franklin
    console.log("Friend 2: ", res.toJS().friends[1]) //Friend 2: Gatsby
    console.log("isPaid: ", res.toJS().isPaid.x) //isPaid: false
    console.log("Name: ", res.toJS().name.x) // Name: Nico
    console.log("Points: ", res.toJS().points.x) // Points: 12
  • 相关阅读:
    数据库相关
    linux相关
    类相关
    异常处理
    一些类的概念
    安装插件
    接口开发
    redis相关
    大数据-概览
    大数据-浅谈OLTP与OLAP
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6184507.html
Copyright © 2020-2023  润新知