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