- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Fluture抽象 future 。
假设我有一个发出 GET 请求的函数。此功能可能成功或失败。
发出请求后,如果成功,则打印一条消息,如果失败,则记录错误并执行命令。
axios.get(endpoint, { timeout: timeoutMs })
.fold(
err =>
logger.errorAsync( err )
.chain( ( ) => cmd.getAsync("pm2 restart app")),
response => logger.infoAsync( "Great success!" )
);
我一直在阅读 API,我发现 bimap
和 fold
都对成功和错误应用了一个函数:
bimap:将左函数映射到拒绝值,或将右函数映射到分辨率值,具体取决于存在哪个。
fold:将左函数应用于拒绝值,或将右函数应用于分辨率值,具体取决于哪个函数存在,并用结果进行解析。
如果您有敏锐的眼光,就会知道我的示例行不通。我需要使用 bimap
,但我不明白为什么。
bimap
,什么时候应该使用fold
?最佳答案
让我们首先检查一下它们各自的类型签名:
bimap :: (a -> c) -> (b -> d) -> Future a b -> Future c d
fold :: (a -> c) -> (b -> c) -> Future a b -> Future d c
差异非常细微,但显而易见。有两个主要区别:
bimap
中,两者允许函数返回不同的类型。在 fold
中,两个函数必须返回相同类型的值。bimap
中,你得到一个 Future where拒绝包含从左函数返回的类型的值,并且分辨率包含从右侧返回的类型的值功能。在 fold
中,拒绝端包含一个全新的类型变量,它尚未受到限制,决议方包含的值(value)both 函数返回的类型。这太啰嗦了,可能有点难以解析。我将尝试在图表中将其可视化。
对于bimap
,它看起来像下面这样。这两个分支不交互:
rej(x) res(y)
| |
| |
bimap(f)(g): f(x) g(y)
| |
V V
对于 fold
,拒绝分支会“停止”,而解决分支会继续 f(x)
的返回值或 g(y)
的返回值:
rej(x) res(y)
| |
| |
fold(f)(g): -> f(x)*g(y)
|
V
您可以随时使用bimap
更改拒绝原因和同时分辨率值。做 bimap (f) (g)
就像做撰写 (mapRej (f)) (map (g))
。
只要你想将拒绝移动到解决方案中,就可以使用 fold
分支。在您的情况下,这就是您想要的。你的例子没有的原因工作是因为你最终得到了一个 future 的 future ,你必须展平:
axios.get(endpoint, { timeout: timeoutMs })
.fold(
err =>
logger.errorAsync( err )
.chain( ( ) => cmd.getAsync("pm2 restart app")),
response => logger.infoAsync( "Great success!" )
)
.chain(inner => inner); //<-- Flatten
扁平化 Monad 在函数式编程中很常见,通常是称为 join
,可以像这样实现:
const join = chain(x => x)
关于javascript - Fluture bimap 和 fold,有什么区别,我应该什么时候使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51426121/
我有以下代码: #include #include #include using namespace boost::bimaps; using namespace boost; struct E
我有以下内容: struct foo_and_number_helper { std::string foo; uint64_t number; }; struct foo_and_numbe
我有一个这样的双图: using MyBimap = boost::bimaps::bimap, boost::bimaps::unordered_set_of>; 我想从静态初始化列表构造它
我正在审查 Google Guava API 的功能,并遇到了一种我在“现实世界编程”经验中从未见过的数据结构,即 BiMap。这种构造的唯一好处是能够快速检索给定值的 key 吗?是否存在使用 Bi
我有一个像这样的无序 bimap: using SymPressMap = boost::bimap, boost::bimaps::unordered_se
如果不使用 BiMap 的 .inverse() 函数,您将如何进行反向映射? 我得到了: public static Map> reverseMapping(Map mapping) 我尝试过类似的
根据这个question中使用boost::bimap的建议, 我有一个关于如何解决 bimap 中重复键的问题。 如果我有: , ,是否可以在bimap中插入两次? 我看到了描述 Collecti
我使用了很多形式的容器 boost::bimap, boost::bimaps::set_of > 我在一个头文件中定义它们,这个头文件包含在很多 cpp 文件中(这是在我尽可能限制头文件的公开之后)
我正在尝试获取通过其键访问的值。到目前为止,我有一个我尝试过的最小示例,并且仅适用于左侧访问。 #include #include #include #include #include #i
我想访问 bimap 中重复元素的所有键。我在下面有一些示例代码 #include #include #include #include #include #include namespa
好的,所以我声明了一个 boost::bimap: boost::bimap object_list; 其中 object 和 position 分别是一个类和一个结构。 在 bimap 中存储的当前
Java 编程 迭代 map 的问题 Iterator iterator = plugin.inreview.keySet().iterator(); while (iterator.hasNext(
设 T_1 和 T_2 是两种类型,f: Dom(T_1) -> Dom(T_2) 是一个非双射的单射函数;为了便于讨论,假设我将 f 表示为不同的对,而不是用于计算它的代码。现在,我需要能够相对快速
我正在寻找双向无序 map 。目前,我只有这个。问题是,我不能使用 []。我认为 boost 默认为列表类型。但我想要一个 HashMap 。这怎么可能? #include #include bo
我正在尝试为 C++ 中的枚举创建一个简单的双向查找工具。我的单向查找工作正常... enum MyEnum { One, Two, Three }; const boost:
我正在模板化类中嵌入 boost::bimap,经过多次试验和错误,我发现了一些可以编译的东西和一些不能编译的东西。我正在使用 g++ (GCC) 4.9.2 20150212 (Red Hat 4.
我对BiMap仍然很困惑在 Google collections/Guava 。据称,这两个 bimap 有相同的数据支持;对其中一个的任何更改都会出现在另一个中。 浏览了一下源码,发现Forward
我刚刚读过这篇文章 http://www.ctl.ua.edu/math103/mapcolor/mapcolor.htm 我不明白,如何将此 map (在 bimap 中)转换为图形结构。 进入 如
我想序列化 BiMap与 xStream .由于我不喜欢 xStream 为 BiMap 自动生成的代码,我认为将 BiMap 转换为 HashMap 并仅序列化 HashMap 可能是个好主意,反序
我正在尝试使用 boost::bimap 来满足我的一项要求。下面是示例代码 typedef bimap, multiset_of, set_of_relation<>
我是一名优秀的程序员,十分优秀!