【问题标题】:fp-ts pipeline with Option and chain not working带有选项和链的 fp-ts 管道不起作用
【发布时间】:2019-12-29 16:15:52
【问题描述】:

我有这个示例代码:

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"

【问题讨论】:

    标签: typescript functional-programming fp-ts


    【解决方案1】:

    fp-ts pipe 函数需要初始值 "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在它上面时(实现here):

    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 被维护者视为新的"blessed way"

    【讨论】:

    • 这意味着您只能创建立即评估的临时管道..
    • @bob 添加了flow 作为替代。
    猜你喜欢
    • 2021-08-01
    • 1970-01-01
    • 2021-10-29
    • 2022-10-24
    • 2020-04-18
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多