我有以下代码:
import { Task, task } from "fp-ts/lib/Task"
import { Either, left, right } from "fp-ts/lib/Either"
import { curry } from "fp-ts/lib/function"
import { liftA2 } from "fp-ts/lib/Apply"
import { Repo } from "./repo"
const buildPerson = curry((name: string, age: number): Either<Error, any> => {
if (name !== undefined && age !== undefined) {
return right({ name, age })
} else {
return left(Error("Missing parameter"))
}
})
const validatePerson = (person: any): Either<Error, any> => {
if ( person.age < 18) {
return left(Error("Too Young"))
} else {
return right(person)
}
}
const getNameFromRepo = (repo: Repo): Task<string> => {
return new Task(
() => repo.getName()
)
}
const getAgeFromRepo = (repo: Repo): Task<number> => {
return new Task(
() => repo.getAge()
)
}
const savePerson = curry((person:any, repo: Repo): Task<void> => {
return new Task(
() => {
console.log(person)
return repo.setPerson(person)
}
)
})
const hello = async () => {
const repo = new Repo()
await liftA2(task)(buildPerson)(getNameFromRepo(repo))(getAgeFromRepo(repo))
.map(
(e) => e.chain(
(p) => validatePerson(p)
)
)
.map(
(e) => e.fold(
(l) => console.log(l),
(r) => savePerson(r)
)
)
.run()
}
hello()
1) savePerson 函数没有运行,但是返回类型是 Promise
2) Fp-Ts 库表明不推荐使用 liftA2 类型,我应该改用 sequenceT。然而,从签名中不清楚 sequenceT 将如何应用于 buildPerson 的参数,如 liftA2
3)有没有更好的方法来组合功能?