【问题标题】:Ramda Pass "Maybe" Error Message Through Chain CallsRamda 通过链式调用传递“Maybe”错误消息
【发布时间】:2017-07-21 18:04:03
【问题描述】:

假设我有一堆函数返回 Just or Nothing 值,我想像这样将它们链接在一起;

var a = M.Just("5").map(function(data){
    return 1;
}).chain(function(data){
/*Make some operation return Just or Nothing */
    console.log(data);
    return M.Just(2);
}).chain(function(data){
/*Make some operation return Just or Nothing */
    console.log(data);
    return M.Nothing("Reason 1");
}).chain(function(data){
/*Make some operation return Just or Nothing */
    console.log(data);
    return M.Nothing("Reason 2");
}).getOrElse(function(data){
    console.log(data);
    return "Message";
});

console.log(a());

输出:

>     1
>     2
>     undefined
>     Message

在上面的代码中,因为它在函数返回 M.Nothing("Reason 1") 的步骤中失败了,所以它没有通过其他函数,这是我所期望的。我相信没有带参数的 Nothing 的有效构造函数。有没有办法在执行结束时得到这个失败消息?我在民间故事中也试过这个,它与幻想土地规格有关吗?

谢谢

【问题讨论】:

  • 请注意MaybeEither 都包含短路。但是,虽然后者可以提供错误消息,但前者不能。
  • 如果您想收集多个错误,请查看 Validation 类型。

标签: javascript functional-programming ramda.js fantasyland ramda-fantasy


【解决方案1】:

您可以按照文档中的说明将 Either monad 用于此目的。

Either 类型与 Maybe 类型非常相似,因为它通常用于以某种方式表示失败的概念。

我用下面的 Either monad 修改了你给出的例子。

var R = require('ramda');
var M = require('ramda-fantasy').Either;

var a = M.Right("5").map(function(data){
return 1;
}).chain(function(data){
/*Make some operation return Just or Nothing */
console.log(data);
return M.Right(2);
}).chain(function(data){
/*Make some operation return Just or Nothing */
console.log(data);
return M.Left("Reason 1");
}).chain(function(data){
/*Make some operation return Just or Nothing */
console.log(data);
return M.Left("Reason 2");
});
console.log(a);
console.log(a.isLeft);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 2022-01-15
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多