fp-ts函数式编程 - 一些小技巧

问:如何在pipe中实现if/else判断null?
答:Option.fromNullable

import { pipe } from "fp-ts/function";
import * as O from "fp-ts/Option";

let obj = {
  state: {
    value: "test"
  }
};

function calculate(input: { value: string|null }) {
    console.log('input');
  return input?.value;
}

console.log(
  pipe(
    obj.state,
    O.fromNullable,
    O.map((value) => calculate(value))
  )
);

问:取出Either中的成功或失败信息
答:Folder(或Chain),以下是Folder代码示例

import { either as E } from "fp-ts";
import { flow } from "fp-ts/function";

interface Person {
  name: string;
}

function ValidateName(name: string): E.Either<string, string> {
    return  /[a-zA-z]/.test(name)? E.right(name) : E.left("invalid name")
}

const makeError = (message: string) => new Error(message);

const makeUser = flow(
    ValidateName,
  E.map((name): Person => ({ name })),
  E.mapLeft(makeError)
);

// (name: string) => string
const main = flow(
  makeUser,
  E.fold(
    (error) => error.message,
    ({ name }) => `Hi, my name is "${name}"`
  )
);

console.log(main("Tom"));
console.log(main("123"));
posted @ 2021-10-15 09:10  老胡Andy  阅读(357)  评论(0编辑  收藏  举报