fox*_*nut 5 javascript monads functional-programming terminology functor
请原谅我,我会尽力描述我在寻找什么.我没有它的名字,所以它使它变得更加困难.
纵观库,如民间故事和monet.js,我喜欢能够连锁经营有map没有空置检查或if语句,例如使用Maybe,Either,Task.
我想知道是否存在类似的构造来解决以下问题:
mapping一个函数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.
Run Code Online (Sandbox Code Playgroud)
相反,我想构建一些类似的东西
Something(input).map(function1).map(function2).result()
Run Code Online (Sandbox Code Playgroud)
要么
compose(result, map(compose(function2, function1))(Something(input))
Run Code Online (Sandbox Code Playgroud)
这样的结构是否存在?它有名字吗?即使这不存在而且我可以自己写,我也不知道该怎么称呼它.建议欢迎.
谢谢你的帮助!
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;
Run Code Online (Sandbox Code Playgroud)
以下是您如何使用它:
const result = ShortCircuit.of(input, f1).orElseMaybe(f2).orElseMaybe(f3).get();
Run Code Online (Sandbox Code Playgroud)
欢迎提出改进建议.
您正在寻找的是Haskell中的Alternative类型类.我还没有找到1个实现它的JS库,尽管在PureScript中支持它并且讨论在FantasyLand中指定它.
无论如何,我在Folktale中找到了一个完全符合你想要的功能:也许是orElse.你会这样使用它:
Something(input).orElse(function1).orElse(function2).get() // `get` throws when all failed
Run Code Online (Sandbox Code Playgroud)
更妙的是,orElse不仅可为Maybe也对Either,Validation以及Task!
这个getOrElse方法orElse在Monet.js中已知,并不是很有用,因为只有在失败的情况下它才会执行你的"处理程序".您可以Alternative使用该cata方法实现自己的.
1:谷歌搜索"JS替代"也没有真正的帮助,即使你知道这个名字:-)
哦,为了防止你使用promises,总有.catch(…)一种方法具有广泛的(ES6支持的)支持.