繁体   English   中英

fp-ts:如何组合多个期权生产者?

fp-ts: How to combine multiple Option producers?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在寻找具有此行为的fp-ts函数:

function compute1(arg: number): Option<number>;
function compute2(arg: number): Option<number>;
function compute3(arg: number): Option<number>;

function compute(arg: number): Option<number> {
  const first = compute1(arg)
  if (isSome(first)) return first

  const second = compute2(arg)
  if (isSome(second)) return second

  const third = compute3(arg)
  if (isSome(third)) return third

  return none
}

// For example I am looking for this `or` function:
const compute = or([
  compute1,
  compute2,
  compute3,
])

我无法在此处的Option文档中找到相应的功能。

1 个回复

我认为您正在 Option 库中寻找getLastMonoid 这将为您提供最正确的some值,如下表所示:

× 连接(x,y)
没有 没有 没有
一些(一) 没有 一些(一)
没有 一些(一) 一些(一)
一些(一) 一些(b) 一些(b)

但是,这仅对Option对有帮助,为了将其应用于Option数组,您需要依赖Array 中reduceRight函数。 与原生 javascript 数组中的 reduce 函数类似,它将采用初始值 B 并将其传递给函数f直到它遍历整个数组。

将所有这些放在一起,您的计算功能可以替换为以下内容:

import { getLastMonoid, some, none, Option } from "fp-ts/lib/Option";
import { reduceRight } from "fp-ts/lib/Array";

import { pipe } from "fp-ts/lib/function";

const M = getLastMonoid<number>();

const list = [some(1), some(2), some(3)];

const compute = (list: Option<number>[]): Option<number> =>
  pipe(list, reduceRight(none, M.concat));

console.log(compute(list)); // some(3)
1 如何在fp-ts中合并两个对象的左侧?

对于返回Either不同值,我有两个验证函数。 如果它们中的一个具有left值,我想抛出一个异常,如果两个都right ,则不执行任何操作。 我以前从未使用过fp-ts,也无法弄清楚如何正确组合左结果。 我当前的解决方案有效,但感觉不到我使用的正确。 import { Either, l ...

5 如何在 FP 中管理 monad,特别是在 fp-ts 中

我对函数式编程和特别是fp-ts库很fp-ts 。 我的问题包括两部分: 我看到了一种将 Monads 从一种类型转换为另一种类型的模式,例如从Task到IO ,反之亦然,我们如何管理这种情况,我们应该始终保持在一个类型上,还是应该随着链的继续而改变? 如何简单地使打字稿遵循这些从一个到 ...

6 fp-ts 和jest:Option 和Either 的人体工程学测试?

我正在使用fp-ts ,并使用 Jest 编写单元测试。 在许多情况下,我正在测试可为空的结果,通常用Option或Either表示(通常,数组find s)。 如果结果是无(以Option为例),并且继续知道这个结果是一些,那么使测试失败的最符合人体工程学的方法是什么? 这是我目前如何解决问题的 ...

7 fp-ts - 管道已弃用

我在我的打字稿/反应项目中使用了"fp-ts": "^2.10.5"并且我收到一条警告,指出 "pipe" 已被弃用。 下面的代码来自这个关于使用 fp-ts 进行错误处理和验证的教程: import { Either, left, right } from 'fp-ts/lib/Either' i ...

8 什么是 fp-ts 谓词?

我正在尝试使用 fp-ts 实现一些简单的数据验证,并遇到了这个代码和框示例: import * as E from "fp-ts/lib/Either"; import { getSemigroup, NonEmptyArray } from "fp-ts/lib/NonEmptyArray"; ...

9 FP-TS消耗的IO

此代码中forEach部分的惯用fp替代方案是什么 const ios: IO&lt;void&gt;[] = [...] ios.forEach(io =&gt; io()); ? 有一些使用Foldable sequence_文档,但在fp-ts@2.0.3中不再可用。 ...

2019-07-23 14:28:58 1 42   fp-ts
10 如何在 fp-ts 中避免带有链的厄运金字塔?

我经常遇到这种情况,我需要完成几个顺序操作。 如果每个操作都只使用上一步中的数据,那么我可以很高兴地执行诸如pipe(startingData, TE.chain(op1), TE.chain(op2), TE.chain(op3), ...) 。 当op2也需要来自startingData数据而没 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM