0

我有这个示例代码:

import {none, some, chain} from 'fp-ts/lib/Option';
import {pipe} from 'fp-ts/lib/pipeable';

const f1 = (input: string) => {
    return some(input + " f1")
};
const f2 = (input: string) => {
    return some(input + "f2")
};
const f3 = (input: string) => {
    return none;
};
const f4 = (input: string) => {
    return some(input + "f4");
};

const result = pipe(
    f1,
    chain(f2),
    chain(f3),
    chain(f4),
)("X");

console.log("result", result);

我收到了这个编译时错误

Argument of type '(input: string) => Option<string>' is not assignable to parameter of type 'Option<string>'.
  Type '(input: string) => Option<string>' is missing the following properties from type 'Some<string>': _tag, value

18     f1,
       ~~

  src/index.ts:18:5
    18     f1,
           ~~
    Did you mean to call this expression?

我的代码有什么问题?

我期望f1f2运行和其他功能不是因为none返回,f3最后输出是Some "X f1 f2"

4

1 回答 1

8

fp-tspipe函数期望初始值"X"作为第一个参数,以促进 TypeScript 从左到右的通用推理。

因此,与其他以柯里化方式传递初始值的 fp 库相比,您可以按如下方式创建管道:

const result = pipe(
  "X", // here is initial argument
  f1,
  chain(f2),
  chain(f3),
  chain(f4)
); // type: Option<string>, actual value is None

返回值将是None- 一旦一个选项是None,它将保持None,当你chain超过它时(在此处实现):

chain((n: number) => some(n*2))(none) // stays None

编辑:

flow(相当于其他库的pipe)是另一种选择,它的行为方式与您在示例中想要的方式一样:

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

const result3 = flow(
  f1,
  chain(f2),
  chain(f3),
  chain(f4)
)("X")

可能会出现类型问题。例如,必须将第一个函数 ( f1) 的函数参数类型用显式类型进行注释。还要考虑一下,这pipe被维护者视为组合的新“祝福方式”

于 2019-12-29T17:21:59.713 回答