1

我正在寻找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找到相应的功能。

4

1 回答 1

3

我认为您正在getLastMonoid选项库中寻找。这将为您提供最合适的some值,如下表所示:

X 是的 连接(x,y)
没有任何 没有任何 没有任何
一些(一) 没有任何 一些(一)
没有任何 一些(一) 一些(一)
一些(一) 一些(b) 一些(b)

但是,这只对成对的 有帮助Option,为了将其应用于 的数组Option,您需要依赖ArrayreduceRight中的函数。类似于 vanilla 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)
于 2021-01-27T07:27:09.903 回答