【发布时间】:2016-03-19 05:32:15
【问题描述】:
请原谅我,我会尽力描述我在寻找什么。我没有它的名字,所以它使它变得更加困难。
查看诸如 Folktale 和 monet.js 之类的库,我喜欢能够使用 map 链接操作而无需空检查或 if 语句,例如使用Maybe, Either, Task.
我想知道是否存在类似的构造来解决以下问题:
- 我有一个初始输入。
- 我想构造一个对输入进行操作的函数链。
- 每个函数可能会或可能不会返回结果。
- 如果函数没有返回结果,则调用链中的下一个函数。
- 一旦函数返回结果,忽略链中的其余函数(类似于
mappingMaybe.Nothing上的函数) - 返回结果。
换句话说,我正在寻找类似于Maybe 的东西,它保存一个值并将函数映射到Just,但忽略映射到Nothing 的函数,您可以提取该值。我正在寻找包含输入和初始null 结果的东西。当您 map 一个函数时,只有当 result 为空时,它才会在输入上运行该函数。如果函数返回一个值,则该值将成为结果,并且任何其他映射的函数都将被忽略。最后,您可以提取结果。
在命令式编程中,这可能看起来像:
var result1 = function1(input);
if (result1) {
return result1;
}
var result2 = function2(input);
if (result2) {
return result2;
}
// and so on.
相反,我想按照以下方式构建一些东西
Something(input).map(function1).map(function2).result()
或
compose(result, map(compose(function2, function1))(Something(input))
这样的结构存在吗?它有名字吗?即使这不存在并且我可以自己编写它,我也不知道该怎么称呼它。欢迎提出建议。
感谢您的帮助!
更新
按照@Bergi 的解决方案,我使用了Maybe.orElse。我写了一个名为 ShortCircuit 的小助手,我将其发布在下面,以防有人发现它有用。
import Maybe from "data.maybe";
const ShortCircuit = function(input, result) {
this.input = input;
this.result = result;
};
ShortCircuit.of = function(input, f) {
return new ShortCircuit(input, Maybe.fromNullable(f(input)));
};
ShortCircuit.prototype.orElseMaybe = function(f) {
return new ShortCircuit(this.input, this.result.orElse(() => Maybe.fromNullable(f(this.input))));
};
ShortCircuit.prototype.get = function() {
return this.result.get();
};
export default ShortCircuit;
这是你如何使用它的:
const result = ShortCircuit.of(input, f1).orElseMaybe(f2).orElseMaybe(f3).get();
欢迎提出改进建议。
【问题讨论】:
-
可以实现一个队列;或使用
Promise -
some 可能会有所帮助,而不是使用
map
标签: javascript functional-programming monads terminology functor