Javascript 函子或单子的名称和存在性,以链接和终止操作序列
请原谅我,我会尽我所能描述我在寻找什么。我没有它的名字,所以它使它变得更加困难 查看诸如和之类的库,我喜欢能够使用Javascript 函子或单子的名称和存在性,以链接和终止操作序列,javascript,functional-programming,monads,terminology,functor,Javascript,Functional Programming,Monads,Terminology,Functor,请原谅我,我会尽我所能描述我在寻找什么。我没有它的名字,所以它使它变得更加困难 查看诸如和之类的库,我喜欢能够使用map链接操作,而无需空检查或if语句,例如使用Maybe,或,任务 我想知道是否存在类似的构造来解决以下问题: 我有一个初始输入 我想构建一个对输入进行操作的函数链 每个函数可能返回结果,也可能不返回结果 如果函数不返回结果,则调用链中的下一个函数 函数返回结果后,忽略链中的其余函数(类似于mapping函数上的Maybe.Nothing) 返回结果 换句话说,我正在寻找类似于
map
链接操作,而无需空检查或if
语句,例如使用Maybe
,或,任务
我想知道是否存在类似的构造来解决以下问题:
- 我有一个初始输入
- 我想构建一个对输入进行操作的函数链
- 每个函数可能返回结果,也可能不返回结果
- 如果函数不返回结果,则调用链中的下一个函数
- 函数返回结果后,忽略链中的其余函数(类似于
map
ping函数上的Maybe.Nothing
)
- 返回结果
换句话说,我正在寻找类似于Maybe
的东西,它保存一个值并将函数映射到Just
上,但忽略映射到Nothing
上的函数,您可以提取该值。我正在寻找包含输入和初始null
结果的东西。当您映射一个函数时,只有当结果
为空时,它才会在输入上运行该函数。如果函数返回一个值,则该值将成为结果,并且将忽略映射的任何其他函数。最后,您可以提取结果
在命令式编程中,这可能看起来像:
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()
或
这样的构造存在吗?它有名字吗?即使这不存在,我可以自己写,我也不知道该怎么称呼它。欢迎提出建议
谢谢你的帮助
更新
按照@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();
欢迎您提出改进建议。您正在寻找的被称为in Haskell。我还没有找到一个实现它的JS库,尽管有和
不管怎样,我在民间故事中发现了一个函数,它完全满足您的需求:。您可以这样使用它:
Something(input).orElse(function1).orElse(function2).get() // `get` throws when all failed
更好的是,orElse
不仅可用于可能
,还可用于或
、验证
和任务
被称为的,并没有真正的帮助,因为它不会仅在失败的情况下执行您的“处理程序”。通过使用cata
方法,您可以实现自己的备选方案
1:谷歌搜索“JS alternative”也不是很有帮助,即使你知道它的名字:-)
哦,如果您使用的是promises,那么总会有一个具有广泛(ES6支持)支持的应用程序。可以实现队列;或者使用Promise
可能会有所帮助,而不是使用map
Nice,orElse
看起来很合适。让我来试验一下,我会回来确认的。谢谢@Bergi!谢谢var-toMaybe=function(f){return function(){return Maybe.fromNullable(f());}
var result=Maybe.fromNullable(f1(input)).orElse(toMaybe(function(){return f2(input);})).orElse(toMaybe(function(){return f3(input);})).get()代码>做这个把戏。使用ES6箭头语法看起来更好。谢谢@Bergi@Bergi实例的alt
(fantasy land或Haskell中的
)可能与orElse
具有相同的类型签名,但在Haskell中的实现略有不同。我想说他们是一样的,但显然不是。它们有何不同?@ftor我不知道你在Haskell的哪里找到了orElse
?如果您从syb
包中引用,那么它确实与相同,只是编写方式不同而已。@Bergi是的,就是这样。我只是想知道他们为什么不重用它。这当然是有原因的,但可能并不重要。
Something(input).orElse(function1).orElse(function2).get() // `get` throws when all failed