【问题标题】:Can `Either` types be transformed to `Task` types?`Either` 类型可以转换为 `Task` 类型吗?
【发布时间】:2016-05-07 22:34:24
【问题描述】:

如果我有一个 Task 有一个 Either err b 作为正确(成功)值,我如何组合/合并/转换它们以便成功值直接在 .fork() 中可用,而不是包含在Either?

const Task = require('data.task'); // folktale
const Either = require('data.either');

// eitherYayNay :: Bool → Either String String
const eitherYayNay = bool =>
  bool ? Either.Right('yay') : Either.Left('nay');

// theTask :: Bool → Task Either a b
const theTask = yn =>
  new Task((reject, resolve) => {
    resolve(eitherYayNay(yn));
    // reject();
  });

// niceTask :: Bool → Task a b
// ???

// the desired result...
niceTask(something).fork(
  err => { 
    // err could be the left value of the Task, or of the Either
  },
  val => { 
    console.log(val); // a string, not an Either
  }
);

【问题讨论】:

    标签: javascript functional-programming folktale


    【解决方案1】:

    这就是我会做的:

    var Task   = require("data.task");
    var Either = require("data.either");
    
       // eitherYayNay :: Bool -> Either String String
    const eitherYayNay = bool =>
        bool ?
            Either.Right("yay") :
            Either.Left("nay");
    
       // theTask :: Bool -> Task a (Either String String)
    const theTask = bool => Task.of(eitherYayNay(bool));
    
       // niceTask :: Bool -> Task String String
    const niceTask = bool => theTask(bool).chain(makeNice);
    
       // makeNice :: Either String String -> Task String String
    const makeNice = either =>
        either.isRight ?
            Task.of(either.value) :
            Task.rejected(either.value);
    
    const fork = bool => niceTask(bool).fork(onError, onValue);
    
    const onError = error => console.log("Error: " + error);
    
    const onValue = value => console.log("Value: " + value);
    
    fork(true);  // Value: yay
    fork(false); // Error: nay
    

    查看演示:

    var eitherYayNay = function (bool) {
        return bool ?
            Either.Right("yay") :
            Either.Left("nay");
    };
    
    var theTask = function (bool) {
        return Task.of(eitherYayNay(bool));
    };
    
    var niceTask = function (bool) {
        return theTask(bool).chain(makeNice);
    };
    
    var makeNice = function (either) {
        return either.isRight ?
            Task.of(either.value) :
            Task.rejected(either.value);
    };
    
    var fork = function (bool) {
        return niceTask(bool).fork(onError, onValue);
    };
    
    var onError = function (error) {
        alert("Error: " + error);
    }
    
    var onValue = function (value) {
        alert("Value: " + value);
    }
    
    fork(true);  // Value: yay
    fork(false); // Error: nay
    <script src="https://cdn.rawgit.com/aaditmshah/0b27bf3abfaba225b479/raw/f9c6af5e548d27c0d1932b80a9af7e0568c4a89e/task.js"></script>
    <script src="https://cdn.rawgit.com/aaditmshah/5bf5e66c37663f3777ee/raw/3110fa24652ed42f005ebc40a39b5138db0063f9/either.js"></script>

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      相关资源
      最近更新 更多