请原谅我,我会尽力描述我在寻找什么.我没有它的名字,所以它使它变得更加困难.
纵观库,如民间故事和monet.js,我喜欢能够连锁经营有map
没有空置检查或if
语句,例如使用Maybe
,Either
,Task
.
我想知道是否存在类似的构造来解决以下问题:
我有一个初始输入.
我想构建一个对输入进行操作的函数链.
每个函数可能会也可能不会返回结果.
如果函数未返回结果,请调用链中的下一个函数.
一旦函数返回结果,忽略链中的其余函数(类似于map
ping一个函数Maybe.Nothing
)
返回结果.
换句话说,我正在寻找类似于Maybe
保存值并映射函数Just
但忽略映射的函数的东西Nothing
,并且您可以提取值.我正在寻找能够保持输入和初始null
结果的东西.当你map
是一个函数时,只有在result
为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()
要么
compose(result, map(compose(function2, function1))(Something(input))
这样的结构是否存在?它有名字吗?即使这不存在而且我可以自己写,我也不知道该怎么称呼它.建议欢迎.
谢谢你的帮助!
UPDATE
按照@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();
欢迎提出改进建议.
您正在寻找的是Haskell中的Alternative
类型类.我还没有找到1个实现它的JS库,尽管在PureScript中支持它并且讨论在FantasyLand中指定它.
无论如何,我在Folktale中找到了一个完全符合你想要的功能:也许是orElse
.你会这样使用它:
Something(input).orElse(function1).orElse(function2).get() // `get` throws when all failed
更妙的是,orElse
不仅可为Maybe
也对Either
,Validation
以及Task
!
这个getOrElse
方法orElse
在Monet.js中已知,并不是很有用,因为只有在失败的情况下它才会执行你的"处理程序".您可以Alternative
使用该cata
方法实现自己的.
1:谷歌搜索"JS替代"也没有真正的帮助,即使你知道这个名字:-)
哦,为了防止你使用promises,总有.catch(…)
一种方法具有广泛的(ES6支持的)支持.