当前位置:  开发笔记 > 编程语言 > 正文

名称和存在的functor或monad链接和终止操作序列

如何解决《名称和存在的functor或monad链接和终止操作序列》经验,为你挑选了1个好方法。

请原谅我,我会尽力描述我在寻找什么.我没有它的名字,所以它使它变得更加困难.

纵观库,如民间故事和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.

相反,我想构建一些类似的东西

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();

欢迎提出改进建议.



1> Bergi..:

您正在寻找的是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支持的)支持.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有