zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    给tkinter文本框添加右键菜单
    Python读取图片尺寸、图片格式
    sublime text 3 build 3143 安装详解
    一种使用pyinstaller时图标问题解决方案
    讠己 —— 冫欠 自 云力 扌仓 石马
    python桌面端开发手记(序列化、压缩包、加密、图形界面GUI)
    Spark安装过程纪录
    Zookeeper与HBse安装过程纪录
    搭建分布式Hadoop的填坑纪录
    使用几种常见分类器预测海难幸存者(二分类)
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6184507.html
Copyright © 2011-2022 走看看