zoukankan      html  css  js  c++  java
  • [Functional Programming] Alternative operator for Either

    Thinking about Promise.all, once there is a Promise in the list fails, the whole promise fails.

    There would be good to have an 'Alernative' operator, which just skip the failling one, and continue the work. 'Alternative' works for Either data type;

    const Right = (x) => ({
      x,
      chain: (f) => f(x),
      map: (f) => Right(f(x)),
      concat: (o) => Right(x.concat(o.x)),
      fold: (f, g) => g(x),
      isRight: true,
      isLeft: false,
      toString: `Right(${x})`,
    });
    
    const Left = (x) => ({
      x,
      chain: (f) => Left(x),
      map: (f) => Left(x),
      concat: (o) => Left(x),
      fold: (f, g) => f(x),
      isRight: false,
      isLeft: true,
      toString: `Left(${x})`,
    });
    
    const Alternative = (ex) => ({
      ex,
      concat: (o) => Alternative(o.ex.isLeft ? ex : ex.concat(o.ex)),
    });

    Run:

    const res = Alternative(Right("hello"))
      .concat(Alternative(Right("world")))
      .concat(Alternative(Left("errrr")))
      .concat(Alternative(Right("!!")));
    console.log(res.ex.fold(identity, identity)); // helloworld!!

    Simpify the code:

    const List = (x) => ({
      x,
      foldMap(type, _empty) {
        const empty = _empty ? _empty : type.empty();
        if (!empty) throw new Error(`foldMap expect an empty as second value`);
        return x.map(type).reduce((acc, curr) => {
          return acc.concat(curr);
        }, empty);
      },
    });
    const res1 = List([
      Right("hello"),
      Right("world"),
      Left("errrr"),
      Right("!!!!"),
    ]).foldMap(Alternative, Alternative(Right("")));
    console.log(res1.ex.fold(identity, identity)); // helloworld!!!!
  • 相关阅读:
    complicated用法
    Vue安装并创建一个简单项目
    使用PyCharm创建Django项目及基本配置
    [hackerrank]John and GCD list
    在Web应用程序中执行计划任务(多线程)
    随笔,想了个同步的方案。
    文摘.
    csdn sql 搜索相关帖子。
    Url Rewriting,二级域名,重定向
    杂言
  • 原文地址:https://www.cnblogs.com/Answer1215/p/13031395.html
Copyright © 2011-2022 走看看