zoukankan      html  css  js  c++  java
  • [Compose] 8. A curated collection of Monoids and their uses

    const { List } = require('immutable-ext');
    
    const Right = x => ({
        chain    : f => f(x),
        ap       : other => other.map(x),
        traverse : (of, f) => f(x).map(Right),
        map      : f => Right(f(x)),
        fold     : (f, g) => g(x),
        concat   : o => o.fold(_ => Right(x), y => Right(x.concat(y))),
        toString : () => `Right(${x})`
    })
    
    const Left = x => ({
        chain    : f => Left(x),
        ap       : other => Left(x),
        traverse : (of, f) => of(Left(x)),
        map      : f => Left(x),
        fold     : (f, g) => f(x),
        concat   : o => o.fold(_ => Left(x), y => o),
        toString : () => `Left(${x})`
    });
    
    const fromNullable = x => x != null ?
                              Right(x) :
                              Left(null);
    
    const tryCatch = f => {
        try {
            return Right(f())
        }
        catch( e ) {
            return Left(e)
        }
    };
    
    let stats = List.of({
                              page : 'Home',
                              view : 40
                          }, {
                              page : 'About',
                              view : 10
                          }, {
                              page : 'Help',
                              view : 4
                          });
    
    const Sum = x => ({
        x,
        concat   : ({ x: y }) => Sum(x + y),
        toString : () => `Sum(${x})`
    });
    Sum.empty = () => Sum(0);
    
    const res = stats.foldMap(x => fromNullable(x.view)
    .map(Sum), Right(Sum(0)));
    console.log(res.toString()); // Right(Sum(54))

    If change the data a litte bit:

    let stats = List.of({
                              page : 'Home',
                              view : 40
                          }, {
                              page : 'About',
                              view : 10
                          }, {
                              page : 'Help',
                              view : null
                          });
    
    const Sum = x => ({
        x,
        concat   : ({ x: y }) => Sum(x + y),
        toString : () => `Sum(${x})`
    });
    Sum.empty = () => Sum(0);
    
    const res = stats.foldMap(x => fromNullable(x.view)
    .map(Sum), Right(Sum(0)));
    console.log(res.toString()); // Right(Sum(50))

    Because the view: null, then it will skip .map(sum).

  • 相关阅读:
    python中取列表的后半部分元素
    python中列表分片
    python中统计列表中元素出现的次数
    python中range()函数用法
    pyhton中实现列表元素顺序颠倒
    python中列表元素求交集和并集
    python中编写抽奖小游戏
    python中删除列表元素
    python中列表的去重复和取重复
    欲为Java技术大牛所需的25个学习要点
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6188215.html
Copyright © 2011-2022 走看看