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).

  • 相关阅读:
    详解 final 和 static
    详解 方法的覆盖 —— toString() 与 equals()的覆盖
    详解 继承(上)—— 工具的抽象与分层
    详解 继承(下)—— super关键字 与 多态
    Java 基础讲解
    矩阵 的实现
    C语言 贪吃蛇
    巨大数——三则运算(+、-、*)
    浅谈 循环数组
    人体对电流的反应
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6188215.html
Copyright © 2011-2022 走看看